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