1use 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#[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 pub const ARKOOR: Subsystem = Subsystem::new("bark.arkoor");
30
31 pub const BOARD: Subsystem = Subsystem::new("bark.board");
33
34 pub const OFFBOARD: Subsystem = Subsystem::new("bark.offboard");
36
37 pub const EXIT: Subsystem = Subsystem::new("bark.exit");
39
40 pub const LIGHTNING_RECEIVE: Subsystem = Subsystem::new("bark.lightning_receive");
42
43 pub const LIGHTNING_SEND: Subsystem = Subsystem::new("bark.lightning_send");
45
46 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
160pub(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}