balius_runtime/ledgers/
mod.rs1use 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}