libjuno 0.1.3

Library for JunoLang
use phf_macros::phf_map;
use crate::{ ast::Type, * };

pub struct Builtin {
    pub id: u32,
    pub declare: BuiltinEnum,
}

pub enum BuiltinEnum {
    Function {
        param_types: Option<&'static [&'static str]>,
        return_type: &'static str,
    },
}

const REGISTRY: phf::Map<
    &'static str,
    Builtin
> = phf_map! {
    "printf" => Builtin {
        id: 0,
        declare: BuiltinEnum::Function {
            param_types: None,
            return_type: "void",
        },
    },

    "puts" => Builtin {
        id: 1,
        declare: BuiltinEnum::Function {
            param_types: Some(&["&u8"]),
            return_type: "void",
        },
    },

    "putchar" => Builtin {
        id: 2,
        declare: BuiltinEnum::Function {
            param_types: Some(&["u8"]),
            return_type: "u8",
        },
    },

    "getchar" => Builtin {
        id: 3,
        declare: BuiltinEnum::Function {
            param_types: Some(&[]),
            return_type: "i32",
        },
    },
    "scanf" => Builtin {
        id: 4,
        declare: BuiltinEnum::Function {
            param_types: None,
            return_type: "u8",
        },
    },


};
pub fn is_builtin(name: &str) -> bool {
    REGISTRY.contains_key(name)
}

pub fn get_builtin_id(name: &str) -> u32 {
    ((1 as u32) << 16) | REGISTRY.get(name).unwrap().id
}

pub fn get_builtin(name: &str) -> Option<&Builtin> {
    REGISTRY.get(name)
}