use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::path::PathBuf;
use std::str::FromStr;
const BITCOIND_REGTEST_DEFAULT_PORT: u16 = 18444;
pub fn default_nodes() -> Vec<SocketAddr> {
vec![SocketAddr::new(
IpAddr::V4(Ipv4Addr::LOCALHOST),
BITCOIND_REGTEST_DEFAULT_PORT,
)]
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Default)]
pub enum IncomingSource {
#[default]
Systemd,
Path(PathBuf),
}
#[derive(Clone, Debug, Serialize, Deserialize, Copy, PartialEq, Eq, JsonSchema, Default)]
#[serde(rename_all = "snake_case")]
pub enum BitcoinAdapterLogLevel {
Critical,
Error,
Warning,
#[default]
Info,
Debug,
Trace,
}
impl FromStr for BitcoinAdapterLogLevel {
type Err = String;
fn from_str(input: &str) -> Result<BitcoinAdapterLogLevel, Self::Err> {
match input {
"critical" => Ok(BitcoinAdapterLogLevel::Critical),
"error" => Ok(BitcoinAdapterLogLevel::Error),
"warning" => Ok(BitcoinAdapterLogLevel::Warning),
"info" => Ok(BitcoinAdapterLogLevel::Info),
"debug" => Ok(BitcoinAdapterLogLevel::Debug),
"trace" => Ok(BitcoinAdapterLogLevel::Trace),
other => Err(format!("Unknown log level: {other}")),
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LoggerConfig {
level: BitcoinAdapterLogLevel,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Config {
pub network: String,
#[serde(default)]
pub nodes: Vec<SocketAddr>,
#[serde(default)]
pub incoming_source: IncomingSource,
pub logger: LoggerConfig,
}
impl Config {
pub fn new(
nodes: Vec<SocketAddr>,
uds_path: PathBuf,
log_level: BitcoinAdapterLogLevel,
) -> Config {
Config {
network: String::from("regtest"),
nodes,
incoming_source: IncomingSource::Path(uds_path),
logger: LoggerConfig { level: log_level },
}
}
pub fn get_socket_path(&self) -> Option<PathBuf> {
match &self.incoming_source {
IncomingSource::Systemd => None,
IncomingSource::Path(path) => Some(path.clone()),
}
}
}