1use std::collections::HashMap;
8use std::fmt;
9
10use bitcoin::{Amount, OutPoint};
11
12use ark::vtxo::VtxoRef;
13
14#[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
123pub(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}