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