1use core::fmt;
6use std::str::FromStr;
7pub(crate) mod constants;
8pub mod error;
9pub(crate) mod wallet;
10
11pub mod signer;
12
13use error::{SparkSdkError, ValidationError};
14pub use wallet::handlers::cooperative_exit::{CompleteCoopExitInput, RequestCoopExitInput};
16pub use wallet::handlers::transfer::Transfer;
17pub use wallet::SparkSdk;
18
19pub(crate) mod common_types;
20
21#[cfg(any(test, feature = "integration-tests"))]
22pub mod spark_test_utils;
23
24pub mod rpc;
25
26#[derive(Debug, Copy, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
31#[non_exhaustive]
32pub enum SparkNetwork {
33 Mainnet,
35
36 Regtest,
39}
40
41impl SparkNetwork {
42 pub fn to_bitcoin_network(&self) -> ::bitcoin::Network {
49 match self {
50 SparkNetwork::Mainnet => ::bitcoin::Network::Bitcoin,
51 SparkNetwork::Regtest => ::bitcoin::Network::Regtest,
52 }
53 }
54
55 pub fn marshal_proto(&self) -> i32 {
60 match self {
61 SparkNetwork::Mainnet => spark_protos::spark::Network::Mainnet as i32,
62 SparkNetwork::Regtest => spark_protos::spark::Network::Regtest as i32,
63 }
64 }
65}
66
67impl TryFrom<i32> for SparkNetwork {
68 type Error = SparkSdkError;
69
70 fn try_from(value: i32) -> Result<Self, SparkSdkError> {
71 spark_protos::spark::Network::try_from(value)
72 .map_err(|_| {
73 SparkSdkError::from(ValidationError::InvalidBitcoinNetwork(value.to_string()))
74 })
75 .and_then(|network| network.try_into())
76 }
77}
78
79impl TryFrom<spark_protos::spark::Network> for SparkNetwork {
80 type Error = SparkSdkError;
81
82 fn try_from(value: spark_protos::spark::Network) -> Result<Self, SparkSdkError> {
83 match value {
84 spark_protos::spark::Network::Mainnet => Ok(SparkNetwork::Mainnet),
85 spark_protos::spark::Network::Regtest => Ok(SparkNetwork::Regtest),
86 _ => Err(SparkSdkError::from(ValidationError::InvalidBitcoinNetwork(
87 value.as_str_name().to_string(),
88 ))),
89 }
90 }
91}
92
93impl FromStr for SparkNetwork {
94 type Err = String;
95
96 fn from_str(s: &str) -> Result<Self, String> {
123 match s.to_lowercase().as_str() {
124 "mainnet" => Ok(SparkNetwork::Mainnet),
125 "regtest" => Ok(SparkNetwork::Regtest),
126 _ => Err(format!("Invalid network: {}", s)),
127 }
128 }
129}
130
131impl fmt::Display for SparkNetwork {
132 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
138 match self {
139 SparkNetwork::Mainnet => write!(f, "mainnet"),
140 SparkNetwork::Regtest => write!(f, "regtest"),
141 }
142 }
143}
144
145#[cfg(test)]
146mod tests {
147 use std::str::FromStr as _;
148
149 use crate::SparkNetwork;
150
151 #[test]
152 fn test_spark_network_display() {
153 let network = SparkNetwork::Mainnet;
154 assert_eq!(network.to_string(), "mainnet");
155
156 let network = SparkNetwork::Regtest;
157 assert_eq!(network.to_string(), "regtest");
158 }
159
160 #[test]
161 fn test_spark_network_from_str() {
162 let network = SparkNetwork::from_str("mainnet").unwrap();
163 assert_eq!(network, SparkNetwork::Mainnet);
164 let network = SparkNetwork::from_str("Mainnet").unwrap();
165 assert_eq!(network, SparkNetwork::Mainnet);
166
167 let network = SparkNetwork::from_str("regtest").unwrap();
168 assert_eq!(network, SparkNetwork::Regtest);
169 let network = SparkNetwork::from_str("Regtest").unwrap();
170 assert_eq!(network, SparkNetwork::Regtest);
171
172 let network = SparkNetwork::from_str("testnet");
173 assert!(network.is_err());
174 }
175}