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)]
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}