use bitcoin::Network;
#[cfg(feature = "clap")]
use clap::Parser;
use std::path::{Path, PathBuf};
#[cfg_attr(feature = "clap", derive(Parser))]
#[derive(Debug, Clone)]
pub struct Config {
#[cfg_attr(feature = "clap", arg(short, long))]
pub blocks_dir: PathBuf,
#[cfg_attr(feature = "clap", arg(short, long))]
pub network: bitcoin::Network,
#[cfg_attr(feature = "clap", arg(short, long))]
pub skip_prevout: bool,
#[cfg_attr(feature = "clap", arg(short, long, default_value = "6"))]
pub max_reorg: u8,
#[cfg_attr(feature = "clap", arg(short, long, default_value = "0"))]
pub channels_size: u8,
#[cfg(feature = "db")]
#[cfg_attr(feature = "clap", cfg_attr(feature = "clap", arg(short, long)))]
pub utxo_db: Option<PathBuf>,
#[cfg(feature = "redb")]
#[cfg_attr(feature = "clap", arg(long))]
pub utxo_redb: Option<PathBuf>,
#[cfg_attr(feature = "clap", arg(long, default_value = "0"))]
pub start_at_height: u32,
#[cfg_attr(feature = "clap", arg(long))]
pub stop_at_height: Option<u32>,
#[cfg_attr(feature = "clap", arg(long, default_value = "1"))]
pub serialization_version: u8,
}
impl Config {
pub fn new<P: AsRef<Path>>(path: P, network: Network) -> Self {
Self {
blocks_dir: path.as_ref().to_owned(),
network,
skip_prevout: false,
max_reorg: 6,
channels_size: 0,
#[cfg(feature = "db")]
utxo_db: None,
#[cfg(feature = "redb")]
utxo_redb: None,
start_at_height: 0,
stop_at_height: None,
serialization_version: 1,
}
}
#[cfg(all(not(feature = "db"), not(feature = "redb")))]
pub(crate) fn utxo_manager(&self) -> Result<crate::utxo::AnyUtxo, crate::Error> {
use crate::utxo::{self, AnyUtxo};
Ok(AnyUtxo::Mem(utxo::MemUtxo::new(self.network)))
}
#[cfg(all(not(feature = "db"), feature = "redb"))]
pub(crate) fn utxo_manager(&self) -> Result<crate::utxo::AnyUtxo, crate::Error> {
use crate::utxo::{self, AnyUtxo};
Ok(match &self.utxo_redb {
Some(path) => AnyUtxo::Redb(utxo::RedbUtxo::new(path)?),
None => AnyUtxo::Mem(utxo::MemUtxo::new(self.network)),
})
}
#[cfg(all(feature = "db", not(feature = "redb")))]
pub(crate) fn utxo_manager(&self) -> Result<crate::utxo::AnyUtxo, crate::Error> {
use crate::utxo::{self, AnyUtxo};
Ok(match &self.utxo_db {
Some(path) => AnyUtxo::Db(utxo::DbUtxo::new(path)?),
None => AnyUtxo::Mem(utxo::MemUtxo::new(self.network)),
})
}
#[cfg(all(feature = "db", feature = "redb"))]
pub(crate) fn utxo_manager(&self) -> Result<crate::utxo::AnyUtxo, crate::Error> {
use crate::utxo::{self, AnyUtxo};
Ok(match (&self.utxo_db, &self.utxo_redb) {
(Some(_), Some(_)) => return Err(crate::Error::OneDb),
(Some(path), None) => AnyUtxo::Db(utxo::DbUtxo::new(path)?),
(None, Some(path)) => AnyUtxo::Redb(utxo::RedbUtxo::new(path)?),
(None, None) => AnyUtxo::Mem(utxo::MemUtxo::new(self.network)),
})
}
}