astrox_macros 0.2.13

add user management and canister relation management for canister
Documentation
use candid::{CandidType};
use ic_cdk::export::candid::Deserialize;
use ic_cdk::export::Principal;
use serde::Serialize;

use std::collections::BTreeMap;

#[derive(CandidType, Serialize, Deserialize, Clone, Debug)]
pub struct Registry {
    canisters: BTreeMap<String, Vec<Principal>>,
}

impl Default for Registry {
    fn default() -> Self {
        Registry {
            canisters: BTreeMap::new(),
        }
    }
}

impl Registry {
    pub fn canister_add(&mut self, name: String, canister_id: Principal) {
        let canister_ids = self.canisters.entry(name).or_insert(vec![]);

        if !canister_ids.contains(&canister_id) {
            canister_ids.push(canister_id);
        }
    }

    pub fn canister_remove(&mut self, name: String, canister_id: Principal) {
        let canister_ids = self.canisters.entry(name).or_insert(vec![]);

        canister_ids.retain(|exists_canister_id| *exists_canister_id != canister_id)
    }

    pub fn canister_remove_all(&mut self, name: String) {
        self.canisters.remove(&name);
    }

    pub fn canister_get_all(&self, name: &str) -> Vec<Principal> {
        self.canisters.get(name).cloned().unwrap()
    }

    pub fn canister_get_one(&self, name: &str) -> Option<Principal> {
        match self.canisters.get(name) {
            None => None,
            Some(canisters) => {
                if canisters.is_empty() {
                    None
                } else {
                    Some(canisters.get(0).unwrap().clone())
                }
            }
        }
    }

    pub fn canister_list_all(&self) -> BTreeMap<String, Vec<Principal>> {
        self.canisters.clone()
    }
}