testnumbat_wasm_debug/
contract_map.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use super::*;

use testnumbat_wasm::api::CallableContract;

use alloc::boxed::Box;
use alloc::vec::Vec;
use std::collections::HashMap;

pub type ContractCallFactory<A> = Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>;

pub struct ContractMap<A> {
	factories: HashMap<Vec<u8>, ContractCallFactory<A>>,
}

impl<A> ContractMap<A> {
	pub fn new() -> Self {
		ContractMap {
			factories: HashMap::new(),
		}
	}

	pub fn new_contract_instance(
		&self,
		contract_identifier: &[u8],
		tx_context: TxContext,
	) -> Box<dyn CallableContract<A>> {
		if let Some(new_contract_closure) = self.factories.get(contract_identifier) {
			new_contract_closure(tx_context)
		} else {
			panic!(
				"Unknown contract: {}",
				std::str::from_utf8(contract_identifier).unwrap()
			);
		}
	}

	pub fn register_contract(
		&mut self,
		path: &str,
		new_contract_closure: Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>,
	) {
		self.factories
			.insert(path.as_bytes().to_vec(), new_contract_closure);
	}
}

impl<A> Default for ContractMap<A> {
	fn default() -> Self {
		Self::new()
	}
}