Skip to main content

bark_json/exit/
mod.rs

1pub mod error;
2pub mod package;
3pub mod states;
4
5#[cfg(feature = "utoipa")]
6use utoipa::ToSchema;
7
8use crate::exit::states::{
9	ExitAwaitingDeltaState, ExitProcessingState, ExitClaimInProgressState, ExitClaimableState,
10	ExitClaimedState, ExitStartState, ExitTx, ExitVtxoAlreadySpentState, ExitCanceledState,
11};
12
13/// A utility type to wrap ExitState children so they can be easily serialized. This also helps with
14/// debugging a lot!
15#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
16#[cfg_attr(feature = "utoipa", derive(ToSchema))]
17#[serde(tag = "type", rename_all = "kebab-case")]
18pub enum ExitState {
19	Start(ExitStartState),
20	Processing(ExitProcessingState),
21	AwaitingDelta(ExitAwaitingDeltaState),
22	Claimable(ExitClaimableState),
23	ClaimInProgress(ExitClaimInProgressState),
24	Claimed(ExitClaimedState),
25	VtxoAlreadySpent(ExitVtxoAlreadySpentState),
26	Canceled(ExitCanceledState),
27}
28
29impl From<bark::exit::ExitState> for ExitState {
30	fn from(v: bark::exit::ExitState) -> Self {
31		match v {
32			bark::exit::ExitState::Start(s) => ExitState::Start(ExitStartState {
33				tip_height: s.tip_height,
34			}),
35			bark::exit::ExitState::Processing(s) => ExitState::Processing(ExitProcessingState {
36				tip_height: s.tip_height,
37				transactions: s.transactions.into_iter().map(|t| ExitTx { txid: t.txid, status: t.status.into() }).collect(),
38			}),
39			bark::exit::ExitState::AwaitingDelta(s) => ExitState::AwaitingDelta(ExitAwaitingDeltaState {
40				tip_height: s.tip_height,
41				confirmed_block: s.confirmed_block.into(),
42				claimable_height: s.claimable_height,
43			}),
44			bark::exit::ExitState::Claimable(s) => ExitState::Claimable(ExitClaimableState {
45				tip_height: s.tip_height,
46				claimable_since: s.claimable_since.into(),
47				last_scanned_block: s.last_scanned_block.map(Into::into),
48			}),
49			bark::exit::ExitState::ClaimInProgress(s) => ExitState::ClaimInProgress(ExitClaimInProgressState {
50				tip_height: s.tip_height,
51				claimable_since: s.claimable_since.into(),
52				claim_txid: s.claim_txid,
53			}),
54			bark::exit::ExitState::Claimed(s) => ExitState::Claimed(ExitClaimedState {
55				tip_height: s.tip_height,
56				txid: s.txid,
57				block: s.block.into(),
58			}),
59			bark::exit::ExitState::VtxoAlreadySpent(s) => ExitState::VtxoAlreadySpent(
60				ExitVtxoAlreadySpentState { tip_height: s.tip_height },
61			),
62			bark::exit::ExitState::Canceled(s) => ExitState::Canceled(
63				ExitCanceledState { tip_height: s.tip_height },
64			),
65		}
66	}
67}
68
69/// A flat, data-free discriminator for [ExitState]. The serde representation matches
70/// [ExitState]'s `type` tag (kebab-case).
71#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
72#[cfg_attr(feature = "utoipa", derive(ToSchema))]
73#[serde(rename_all = "kebab-case")]
74pub enum ExitStateKind {
75	Start,
76	Processing,
77	AwaitingDelta,
78	Claimable,
79	ClaimInProgress,
80	Claimed,
81	VtxoAlreadySpent,
82	Canceled,
83}
84
85impl From<bark::exit::ExitStateKind> for ExitStateKind {
86	fn from(v: bark::exit::ExitStateKind) -> Self {
87		match v {
88			bark::exit::ExitStateKind::Start => ExitStateKind::Start,
89			bark::exit::ExitStateKind::Processing => ExitStateKind::Processing,
90			bark::exit::ExitStateKind::AwaitingDelta => ExitStateKind::AwaitingDelta,
91			bark::exit::ExitStateKind::Claimable => ExitStateKind::Claimable,
92			bark::exit::ExitStateKind::ClaimInProgress => ExitStateKind::ClaimInProgress,
93			bark::exit::ExitStateKind::Claimed => ExitStateKind::Claimed,
94			bark::exit::ExitStateKind::VtxoAlreadySpent => ExitStateKind::VtxoAlreadySpent,
95			bark::exit::ExitStateKind::Canceled => ExitStateKind::Canceled,
96		}
97	}
98}
99
100impl std::fmt::Display for ExitStateKind {
101	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
102		let s = match self {
103			ExitStateKind::Start => "start",
104			ExitStateKind::Processing => "processing",
105			ExitStateKind::AwaitingDelta => "awaiting-delta",
106			ExitStateKind::Claimable => "claimable",
107			ExitStateKind::ClaimInProgress => "claim-in-progress",
108			ExitStateKind::Claimed => "claimed",
109			ExitStateKind::VtxoAlreadySpent => "vtxo-already-spent",
110			ExitStateKind::Canceled => "canceled",
111		};
112		f.write_str(s)
113	}
114}