1use std::convert::TryFrom;
15use std::fmt::{Debug, Display};
16use std::hash::Hash;
17
18use amplify::DumbDefault;
19use internet2::presentation::sphinx::Hop;
20use p2p::bolt::PaymentRequest;
21use wallet::psbt::Psbt;
22
23use crate::channel::tx_graph::TxGraph;
24use crate::channel::Funding;
25use crate::{channel, extension, router};
26
27pub trait Nomenclature
33where
34 Self: Clone
35 + Copy
36 + PartialEq
37 + Eq
38 + PartialOrd
39 + Ord
40 + Hash
41 + Debug
42 + Display
43 + Default
44 + TryFrom<u16, Error = strict_encoding::Error>
45 + Into<u16>,
46{
47 type State: DumbDefault;
48 type Error: std::error::Error;
49 type PeerMessage;
50 type UpdateMessage;
51 type UpdateRequest;
52}
53
54pub trait Extension<N: Nomenclature> {
55 fn identity(&self) -> N;
56
57 #[allow(dead_code, unused_variables)]
60 fn state_change(
61 &mut self,
62 request: &<N as extension::Nomenclature>::UpdateRequest,
63 message: &mut <N as extension::Nomenclature>::PeerMessage,
64 ) -> Result<(), <N as extension::Nomenclature>::Error> {
65 Ok(())
67 }
68
69 fn update_from_peer(
72 &mut self,
73 message: &<N as extension::Nomenclature>::PeerMessage,
74 ) -> Result<(), <N as extension::Nomenclature>::Error>;
75
76 fn update_from_local(
78 &mut self,
79 message: &<N as extension::Nomenclature>::UpdateMessage,
80 ) -> Result<(), <N as extension::Nomenclature>::Error>;
81
82 fn load_state(&mut self, state: &N::State);
83 fn store_state(&self, state: &mut N::State);
84}
85
86pub trait RouterExtension<N>
87where
88 N: router::Nomenclature,
89 Self: Extension<N>,
90{
91 #[allow(clippy::new_ret_no_self)]
94 fn new() -> Box<dyn RouterExtension<N>>
95 where
96 Self: Sized;
97
98 fn build_route(
99 &mut self,
100 payment: PaymentRequest,
101 route: &mut Vec<Hop<<N as router::Nomenclature>::HopPayload>>,
102 );
103}
104
105pub trait ChannelExtension<N>
106where
107 N: channel::Nomenclature,
108 N::State: channel::State,
109 Self: Extension<N>,
110{
111 #[allow(clippy::new_ret_no_self)]
114 fn new() -> Box<dyn ChannelExtension<N>>
115 where
116 Self: Sized;
117
118 fn build_graph(
120 &self,
121 tx_graph: &mut TxGraph,
122 remote: bool,
123 ) -> Result<(), <N as Nomenclature>::Error>;
124}
125
126pub trait ChannelConstructor<N>
128where
129 N: channel::Nomenclature,
130 N::State: channel::State,
131 Self: ChannelExtension<N> + Default,
132{
133 fn enrich_funding(
134 &self,
135 psbt: &mut Psbt,
136 funding: &Funding,
137 ) -> Result<(), <N as Nomenclature>::Error>;
138}