|
@@ -1,9 +1,12 @@
|
|
|
use std::path::PathBuf;
|
|
|
+use std::sync::Arc;
|
|
|
|
|
|
+use cdk::cdk_database;
|
|
|
use cdk::nuts::{CurrencyUnit, PublicKey};
|
|
|
use cdk::Amount;
|
|
|
use cdk_axum::cache;
|
|
|
-use cdk_database::DatabaseEngine;
|
|
|
+use cdk_redb::MintRedbDatabase;
|
|
|
+use cdk_sqlite::MintSqliteDatabase;
|
|
|
use config::{Config, ConfigError, File};
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
@@ -150,6 +153,50 @@ fn default_max_delay_time() -> u64 {
|
|
|
3
|
|
|
}
|
|
|
|
|
|
+#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
|
|
|
+#[serde(rename_all = "lowercase")]
|
|
|
+pub enum DatabaseEngine {
|
|
|
+ #[default]
|
|
|
+ Sqlite,
|
|
|
+ Redb,
|
|
|
+}
|
|
|
+
|
|
|
+impl std::str::FromStr for DatabaseEngine {
|
|
|
+ type Err = String;
|
|
|
+
|
|
|
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
|
+ match s.to_lowercase().as_str() {
|
|
|
+ "sqlite" => Ok(DatabaseEngine::Sqlite),
|
|
|
+ "redb" => Ok(DatabaseEngine::Redb),
|
|
|
+ _ => Err(format!("Unknown database engine: {}", s)),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl DatabaseEngine {
|
|
|
+ /// Convert the database instance into a mint database
|
|
|
+ pub async fn mint<P: Into<PathBuf>>(
|
|
|
+ self,
|
|
|
+ work_dir: P,
|
|
|
+ ) -> Result<
|
|
|
+ Arc<dyn cdk_database::MintDatabase<Err = cdk_database::Error> + Sync + Send + 'static>,
|
|
|
+ cdk_database::Error,
|
|
|
+ > {
|
|
|
+ match self {
|
|
|
+ DatabaseEngine::Sqlite => {
|
|
|
+ let sql_db_path = work_dir.into().join("cdk-mintd.sqlite");
|
|
|
+ let db = MintSqliteDatabase::new(&sql_db_path).await?;
|
|
|
+ db.migrate().await;
|
|
|
+ Ok(Arc::new(db))
|
|
|
+ }
|
|
|
+ DatabaseEngine::Redb => {
|
|
|
+ let redb_path = work_dir.into().join("cdk-mintd.redb");
|
|
|
+ Ok(Arc::new(MintRedbDatabase::new(&redb_path)?))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
|
pub struct Database {
|
|
|
pub engine: DatabaseEngine,
|
|
@@ -167,9 +214,9 @@ pub struct Settings {
|
|
|
pub phoenixd: Option<Phoenixd>,
|
|
|
pub lnd: Option<Lnd>,
|
|
|
pub fake_wallet: Option<FakeWallet>,
|
|
|
+ pub database: Database,
|
|
|
pub supported_units: Option<Vec<CurrencyUnit>>,
|
|
|
pub remote_signatory: Option<String>,
|
|
|
- pub database: Database,
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
|
@@ -194,13 +241,13 @@ pub struct MintInfo {
|
|
|
|
|
|
impl Settings {
|
|
|
#[must_use]
|
|
|
- pub fn new<P>(config_file_name: Option<P>, check_ln: bool) -> Self
|
|
|
+ pub fn new<P>(config_file_name: Option<P>) -> Self
|
|
|
where
|
|
|
P: Into<PathBuf>,
|
|
|
{
|
|
|
let default_settings = Self::default();
|
|
|
// attempt to construct settings with file
|
|
|
- let from_file = Self::new_from_default(&default_settings, config_file_name, check_ln);
|
|
|
+ let from_file = Self::new_from_default(&default_settings, config_file_name);
|
|
|
match from_file {
|
|
|
Ok(f) => f,
|
|
|
Err(e) => {
|
|
@@ -213,7 +260,6 @@ impl Settings {
|
|
|
fn new_from_default<P>(
|
|
|
default: &Settings,
|
|
|
config_file_name: Option<P>,
|
|
|
- check_ln: bool,
|
|
|
) -> Result<Self, ConfigError>
|
|
|
where
|
|
|
P: Into<PathBuf>,
|
|
@@ -236,36 +282,34 @@ impl Settings {
|
|
|
.build()?;
|
|
|
let settings: Settings = config.try_deserialize()?;
|
|
|
|
|
|
- if check_ln {
|
|
|
- match settings.ln.ln_backend {
|
|
|
- LnBackend::None => panic!("Ln backend must be set"),
|
|
|
- LnBackend::Cln => assert!(
|
|
|
- settings.cln.is_some(),
|
|
|
- "CLN backend requires a valid config."
|
|
|
- ),
|
|
|
- LnBackend::Strike => assert!(
|
|
|
- settings.strike.is_some(),
|
|
|
- "Strike backend requires a valid config."
|
|
|
- ),
|
|
|
- LnBackend::LNbits => assert!(
|
|
|
- settings.lnbits.is_some(),
|
|
|
- "LNbits backend requires a valid config"
|
|
|
- ),
|
|
|
- LnBackend::Phoenixd => assert!(
|
|
|
- settings.phoenixd.is_some(),
|
|
|
- "Phoenixd backend requires a valid config"
|
|
|
- ),
|
|
|
- LnBackend::Lnd => {
|
|
|
- assert!(
|
|
|
- settings.lnd.is_some(),
|
|
|
- "LND backend requires a valid config."
|
|
|
- )
|
|
|
- }
|
|
|
- LnBackend::FakeWallet => assert!(
|
|
|
- settings.fake_wallet.is_some(),
|
|
|
- "FakeWallet backend requires a valid config."
|
|
|
- ),
|
|
|
+ match settings.ln.ln_backend {
|
|
|
+ LnBackend::None => panic!("Ln backend must be set"),
|
|
|
+ LnBackend::Cln => assert!(
|
|
|
+ settings.cln.is_some(),
|
|
|
+ "CLN backend requires a valid config."
|
|
|
+ ),
|
|
|
+ LnBackend::Strike => assert!(
|
|
|
+ settings.strike.is_some(),
|
|
|
+ "Strike backend requires a valid config."
|
|
|
+ ),
|
|
|
+ LnBackend::LNbits => assert!(
|
|
|
+ settings.lnbits.is_some(),
|
|
|
+ "LNbits backend requires a valid config"
|
|
|
+ ),
|
|
|
+ LnBackend::Phoenixd => assert!(
|
|
|
+ settings.phoenixd.is_some(),
|
|
|
+ "Phoenixd backend requires a valid config"
|
|
|
+ ),
|
|
|
+ LnBackend::Lnd => {
|
|
|
+ assert!(
|
|
|
+ settings.lnd.is_some(),
|
|
|
+ "LND backend requires a valid config."
|
|
|
+ )
|
|
|
}
|
|
|
+ LnBackend::FakeWallet => assert!(
|
|
|
+ settings.fake_wallet.is_some(),
|
|
|
+ "FakeWallet backend requires a valid config."
|
|
|
+ ),
|
|
|
}
|
|
|
|
|
|
Ok(settings)
|