numbat_wasm_debug/
contract_map.rs

1use super::*;
2
3use alloc::{boxed::Box, vec::Vec};
4use numbat_wasm::contract_base::CallableContract;
5use std::collections::HashMap;
6
7pub type ContractCallFactory<A> = Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>;
8
9pub struct ContractMap<A> {
10    factories: HashMap<Vec<u8>, ContractCallFactory<A>>,
11}
12
13impl<A> ContractMap<A> {
14    pub fn new() -> Self {
15        ContractMap {
16            factories: HashMap::new(),
17        }
18    }
19
20    pub fn new_contract_instance(
21        &self,
22        contract_identifier: &[u8],
23        tx_context: TxContext,
24    ) -> Box<dyn CallableContract<A>> {
25        if let Some(new_contract_closure) = self.factories.get(contract_identifier) {
26            new_contract_closure(tx_context)
27        } else {
28            panic!(
29                "Unknown contract: {}",
30                std::str::from_utf8(contract_identifier).unwrap()
31            );
32        }
33    }
34
35    pub fn register_contract(
36        &mut self,
37        path: &str,
38        new_contract_closure: Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>,
39    ) {
40        self.factories
41            .insert(path.as_bytes().to_vec(), new_contract_closure);
42    }
43}
44
45impl<A> Default for ContractMap<A> {
46    fn default() -> Self {
47        Self::new()
48    }
49}