numbat_wasm_debug/
contract_map.rs1use 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}