numbat_wasm_debug/
contract_map.rs

1use 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}