bark/subsystem/
mod.rs

1//! Contains subsystem-related constants and types for Bark.
2//!
3//! In its current form this has little functionality; however, in the future
4//! it will contain interfaces allowing for developers to add their own
5//! subsystems which Bark can use.
6
7use std::collections::HashMap;
8use std::fmt;
9
10use bitcoin::{Amount, OutPoint};
11
12use ark::vtxo::VtxoRef;
13
14/// A unique identifier for a subsystem.
15#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize, Serialize)]
16pub struct SubsystemId(u32);
17
18impl SubsystemId {
19	pub fn new(id: u32) -> Self {
20		SubsystemId(id)
21	}
22}
23
24impl fmt::Display for SubsystemId {
25	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
26		write!(f, "{}", self.0)
27	}
28}
29
30#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
31pub enum RoundMovement {
32	Offboard,
33	Refresh,
34	SendOnchain,
35}
36
37impl fmt::Display for RoundMovement {
38	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39		match self {
40			RoundMovement::Offboard => f.write_str("offboard"),
41			RoundMovement::Refresh => f.write_str("refresh"),
42			RoundMovement::SendOnchain => f.write_str("send_onchain"),
43		}
44	}
45}
46
47#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
48pub(crate) enum BarkSubsystem {
49	Arkoor,
50	Board,
51	Exit,
52	LightningReceive,
53	LightningSend,
54	Round,
55}
56
57impl BarkSubsystem {
58	pub fn as_str(&self) -> &'static str {
59		match self {
60			BarkSubsystem::Arkoor => "bark.arkoor",
61			BarkSubsystem::Board => "bark.board",
62			BarkSubsystem::Exit => "bark.exit",
63			BarkSubsystem::LightningReceive => "bark.lightning_receive",
64			BarkSubsystem::LightningSend => "bark.lightning_send",
65			BarkSubsystem::Round => "bark.round",
66		}
67	}
68}
69
70#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
71pub(crate) enum ArkoorMovement {
72	Receive,
73	Send,
74}
75
76impl fmt::Display for ArkoorMovement {
77	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
78		match self {
79			ArkoorMovement::Receive => f.write_str("receive"),
80			ArkoorMovement::Send => f.write_str("send"),
81		}
82	}
83}
84
85#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
86pub(crate) enum BoardMovement {
87	Board,
88}
89
90impl BoardMovement {
91	pub fn metadata(
92		outpoint: OutPoint,
93		onchain_fee: Amount,
94	) -> anyhow::Result<HashMap<String, serde_json::Value>> {
95		Ok(HashMap::from([
96			("chain_anchor".into(), serde_json::to_value(outpoint)?),
97			("onchain_fee_sat".into(), serde_json::to_value(onchain_fee.to_sat())?),
98		]))
99	}
100}
101
102impl fmt::Display for BoardMovement {
103	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
104		match self {
105			BoardMovement::Board => f.write_str("board"),
106		}
107	}
108}
109
110#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
111pub(crate) enum ExitMovement {
112	Exit,
113}
114
115impl fmt::Display for ExitMovement {
116	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
117		match self {
118			ExitMovement::Exit => f.write_str("start"),
119		}
120	}
121}
122
123/// Provides helper methods for lightning-related movements.
124pub(crate) struct LightningMovement {}
125
126impl LightningMovement {
127	pub fn htlc_metadata(
128		htlcs: impl IntoIterator<Item = impl VtxoRef>,
129	) -> anyhow::Result<impl IntoIterator<Item = (String, serde_json::Value)>> {
130		let htlcs = htlcs.into_iter().map(|v| v.vtxo_id()).collect::<Vec<_>>();
131		Ok([("htlc_vtxos".into(), serde_json::to_value(&htlcs)?)])
132	}
133}
134
135#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
136pub(crate) enum LightningReceiveMovement {
137	Receive,
138}
139
140impl fmt::Display for LightningReceiveMovement {
141	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
142		match self {
143			LightningReceiveMovement::Receive => f.write_str("receive"),
144		}
145	}
146}
147
148#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
149pub(crate) enum LightningSendMovement {
150	Send,
151}
152
153impl fmt::Display for LightningSendMovement {
154	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
155		match self {
156			LightningSendMovement::Send => f.write_str("send"),
157		}
158	}
159}