balius_runtime/ledgers/
mod.rs

1use std::sync::Arc;
2
3use tokio::sync::Mutex;
4
5use crate::wit::balius::app::ledger as wit;
6
7pub mod mock;
8pub mod u5c;
9
10pub use wit::{Host as CustomLedger, LedgerError, TxoRef, Utxo, UtxoPage, UtxoPattern};
11
12#[derive(Clone)]
13#[allow(clippy::large_enum_variant)]
14pub enum Ledger {
15    Mock(mock::Ledger),
16    U5C(u5c::Ledger),
17    Custom(Arc<Mutex<dyn wit::Host + Send + Sync>>),
18}
19
20impl From<mock::Ledger> for Ledger {
21    fn from(ledger: mock::Ledger) -> Self {
22        Ledger::Mock(ledger)
23    }
24}
25
26impl From<u5c::Ledger> for Ledger {
27    fn from(ledger: u5c::Ledger) -> Self {
28        Ledger::U5C(ledger)
29    }
30}
31
32#[async_trait::async_trait]
33impl wit::Host for Ledger {
34    async fn read_utxos(
35        &mut self,
36        refs: Vec<wit::TxoRef>,
37    ) -> Result<Vec<wit::Utxo>, wit::LedgerError> {
38        match self {
39            Ledger::Mock(ledger) => ledger.read_utxos(refs).await,
40            Ledger::U5C(ledger) => ledger.read_utxos(refs).await,
41            Ledger::Custom(ledger) => {
42                let mut lock = ledger.lock().await;
43                lock.read_utxos(refs).await
44            }
45        }
46    }
47
48    async fn search_utxos(
49        &mut self,
50        pattern: wit::UtxoPattern,
51        start: Option<String>,
52        max_items: u32,
53    ) -> Result<wit::UtxoPage, wit::LedgerError> {
54        match self {
55            Ledger::Mock(ledger) => ledger.search_utxos(pattern, start, max_items).await,
56            Ledger::U5C(ledger) => ledger.search_utxos(pattern, start, max_items).await,
57            Ledger::Custom(ledger) => {
58                let mut lock = ledger.lock().await;
59                lock.search_utxos(pattern, start, max_items).await
60            }
61        }
62    }
63
64    async fn read_params(&mut self) -> Result<wit::Json, wit::LedgerError> {
65        match self {
66            Ledger::Mock(ledger) => ledger.read_params().await,
67            Ledger::U5C(ledger) => ledger.read_params().await,
68            Ledger::Custom(ledger) => {
69                let mut lock = ledger.lock().await;
70                lock.read_params().await
71            }
72        }
73    }
74}