numbat_wasm_debug/
contract_map.rs1use super::*;
2
3use numbat_wasm::CallableContract;
4
5use alloc::boxed::Box;
6use alloc::vec::Vec;
7use std::collections::HashMap;
8
9pub struct ContractMap<A> {
10 factories: HashMap<Vec<u8>, Box<dyn Fn(TxContext) -> Box<dyn CallableContract<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: &Vec<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!("Unknown contract");
29 }
30 }
31
32 pub fn register_contract(
33 &mut self,
34 path: &str,
35 new_contract_closure: Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>,
36 ) {
37 self.factories
38 .insert(path.as_bytes().to_vec(), new_contract_closure);
39 }
40}
41
42impl<A> Default for ContractMap<A> {
43 fn default() -> Self {
44 Self::new()
45 }
46}