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
use super::*;

use elrond_wasm::CallableContract;

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

pub struct ContractMap<A> {
    factories: HashMap<Vec<u8>, Box<dyn Fn(TxContext) -> Box<dyn CallableContract<A>>>>,
}

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

    pub fn new_contract_instance(&self,
        contract_identifier: &Vec<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");
        }
    }

    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);
    }
}