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::fmt;
8
9use bitcoin::consensus::encode::serialize_hex;
10use bitcoin::{Amount, OutPoint, Transaction};
11
12use ark::lightning::{PaymentHash, Preimage};
13use ark::vtxo::VtxoRef;
14
15/// A unique identifier for a subsystem.
16#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Deserialize, Serialize)]
17pub struct Subsystem(&'static str);
18
19impl Subsystem {
20	pub const fn new(id: &'static str) -> Self {
21		Subsystem(id)
22	}
23
24	pub fn as_name(&self) -> &'static str {
25		self.0
26	}
27
28	/// The built-in arkoor subsystem
29	pub const ARKOOR: Subsystem = Subsystem::new("bark.arkoor");
30
31	/// The built-in board subsystem
32	pub const BOARD: Subsystem = Subsystem::new("bark.board");
33
34	/// The built-in offboard subsystem
35	pub const OFFBOARD: Subsystem = Subsystem::new("bark.offboard");
36
37	/// The built-in exit subsystem
38	pub const EXIT: Subsystem = Subsystem::new("bark.exit");
39
40	/// The built-in Lightning receive subsystem
41	pub const LIGHTNING_RECEIVE: Subsystem = Subsystem::new("bark.lightning_receive");
42
43	/// The built-in Lightning send subsystem
44	pub const LIGHTNING_SEND: Subsystem = Subsystem::new("bark.lightning_send");
45
46	/// The built-in round subsystem
47	pub const ROUND: Subsystem = Subsystem::new("bark.round");
48}
49
50impl fmt::Display for Subsystem {
51	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
52		f.write_str(self.0)
53	}
54}
55
56#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
57pub enum RoundMovement {
58	Refresh,
59}
60
61impl fmt::Display for RoundMovement {
62	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
63		match self {
64			RoundMovement::Refresh => f.write_str("refresh"),
65		}
66	}
67}
68
69#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
70pub(crate) enum ArkoorMovement {
71	Receive,
72	Send,
73}
74
75impl fmt::Display for ArkoorMovement {
76	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77		match self {
78			ArkoorMovement::Receive => f.write_str("receive"),
79			ArkoorMovement::Send => f.write_str("send"),
80		}
81	}
82}
83
84#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
85pub(crate) enum BoardMovement {
86	Board,
87}
88
89impl BoardMovement {
90	pub fn metadata(
91		outpoint: OutPoint,
92		onchain_fee: Amount,
93	) -> impl IntoIterator<Item = (String, serde_json::Value)> {
94		[
95			(
96				"chain_anchor".into(),
97				serde_json::to_value(outpoint).expect("outpoint can serde"),
98			),
99			(
100				"onchain_fee_sat".into(),
101				serde_json::to_value(onchain_fee.to_sat()).expect("int can serde"),
102			),
103		]
104	}
105}
106
107impl fmt::Display for BoardMovement {
108	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
109		match self {
110			BoardMovement::Board => f.write_str("board"),
111		}
112	}
113}
114
115#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
116pub(crate) enum OffboardMovement {
117	Offboard,
118	SendOnchain,
119}
120
121impl OffboardMovement {
122	pub fn metadata(
123		offboard_tx: &Transaction,
124	) -> impl IntoIterator<Item = (String, serde_json::Value)> {
125		[
126			(
127				"offboard_txid".into(),
128				serde_json::to_value(offboard_tx.compute_txid()).expect("txid can serde"),
129			),
130			(
131				"offboard_tx".into(),
132				serde_json::to_value(serialize_hex(&offboard_tx)).expect("string can serde"),
133			),
134		]
135	}
136}
137
138impl fmt::Display for OffboardMovement {
139	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
140		match self {
141			OffboardMovement::Offboard => f.write_str("offboard"),
142			OffboardMovement::SendOnchain => f.write_str("send_onchain"),
143		}
144	}
145}
146
147#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
148pub(crate) enum ExitMovement {
149	Exit,
150}
151
152impl fmt::Display for ExitMovement {
153	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
154		match self {
155			ExitMovement::Exit => f.write_str("start"),
156		}
157	}
158}
159
160/// Provides helper methods for lightning-related movements.
161pub(crate) struct LightningMovement {}
162
163impl LightningMovement {
164	pub fn metadata(
165		payment_hash: PaymentHash,
166		htlcs: impl IntoIterator<Item = impl VtxoRef>,
167		payment_preimage: Option<Preimage>,
168	) -> impl IntoIterator<Item = (String, serde_json::Value)> {
169		let htlcs = htlcs.into_iter().map(|v| v.vtxo_id()).collect::<Vec<_>>();
170		[
171			(
172				"payment_hash".into(),
173				serde_json::to_value(payment_hash).expect("payment hash can serde"),
174			),
175			(
176				"htlc_vtxos".into(),
177				serde_json::to_value(&htlcs).expect("vtxo ids can serde"),
178			),
179			(
180				"payment_preimage".into(),
181				serde_json::to_value(payment_preimage).expect("payment preimage can serde"),
182			),
183		]
184	}
185}
186
187#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
188pub(crate) enum LightningReceiveMovement {
189	Receive,
190}
191
192impl fmt::Display for LightningReceiveMovement {
193	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
194		match self {
195			LightningReceiveMovement::Receive => f.write_str("receive"),
196		}
197	}
198}
199
200#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
201pub(crate) enum LightningSendMovement {
202	Send,
203}
204
205impl fmt::Display for LightningSendMovement {
206	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
207		match self {
208			LightningSendMovement::Send => f.write_str("send"),
209		}
210	}
211}