use {
    alloc::{string::String, vec::Vec},
    hashbrown::HashMap,
};
#[derive(Debug, PartialEq, Clone)]
pub struct Type {}
#[derive(Debug, PartialEq, Clone)]
pub struct Funct {
    takes: Vec<String>,
    gives: Vec<String>,
}
#[derive(Debug, PartialEq, Clone)]
pub struct Protocol<'a> {
    types: HashMap<&'a str, Type>,
    fns:   HashMap<&'a str, Funct>,
}
impl<'a> Protocol<'a> {
    pub fn void() -> Self {
        Self {
            types: HashMap::new(),
            fns:   HashMap::new(),
        }
    }
    // Check if a protocol defines all types it needs too
    fn validate_protocol() -> bool {
        false
    }
}

impl<'a> From<&'a str> for Protocol<'a> {
    fn from(value: &'a str) -> Self {
        let mut hm_t = HashMap::new();
        hm_t.insert(value, Type {});
        Self {
            types: hm_t,
            fns:   HashMap::new(),
        }
    }
}