use crate::modules::whitelist::events::{AddedToWhitelist, RemovedFromWhitelist};
use crate::utils::Error;
use odra::contract_env::{caller, revert};
use odra::types::event::OdraEvent;
use odra::types::Address;
use odra::Mapping;
#[odra::module]
pub struct Whitelist {
    pub whitelist: Mapping<Address, bool>,
}
#[odra::module]
impl Whitelist {
    pub fn add_to_whitelist(&mut self, address: Address) {
        self.whitelist.set(&address, true);
        AddedToWhitelist { address }.emit();
    }
    pub fn remove_from_whitelist(&mut self, address: Address) {
        self.whitelist.set(&address, false);
        RemovedFromWhitelist { address }.emit();
    }
    pub fn ensure_whitelisted(&self) {
        if !self.is_whitelisted(caller()) {
            revert(Error::NotWhitelisted);
        }
    }
    pub fn is_whitelisted(&self, address: Address) -> bool {
        self.whitelist.get(&address).unwrap_or(false)
    }
}
pub mod events {
    use odra::types::Address;
    use odra::Event;
    #[derive(Debug, PartialEq, Eq, Event)]
    pub struct AddedToWhitelist {
        pub address: Address,
    }
    #[derive(Debug, PartialEq, Eq, Event)]
    pub struct RemovedFromWhitelist {
        pub address: Address,
    }
}