use crate::core::{compile::check::*, util::*};
pub mod prelude;
pub mod pyth;
pub mod python;
pub use prelude::Prelude;
pub use pyth::Pyth;
pub use python::Python;
pub trait BuiltinSource: std::fmt::Debug + Clone + PartialEq {
fn name(&self) -> String;
fn ty(&self) -> Ty;
fn as_instance(&self, params: &Vec<Ty>) -> CResult<()>;
fn attr(&self, attr: &String) -> Option<(Ty, Ty)>;
fn index(&self) -> Option<(Ty, Ty)>;
fn static_attr(&self, attr: &String) -> Option<Ty>;
fn casted(&self, ty: &Ty) -> Option<(Ty, Ty)>;
}
#[derive(Clone, Debug, PartialEq)]
pub enum Builtin {
Python(Python),
Prelude(Prelude),
Pyth(Pyth),
}
impl From<python::Python> for Builtin {
fn from(builtin: python::Python) -> Self {
Self::Python(builtin)
}
}
macro_rules! match_builtin {
($self:expr, $builtin:pat, $func:expr) => {
match $self {
Self::Python($builtin) => $func,
Self::Prelude($builtin) => $func,
Self::Pyth($builtin) => $func,
}
};
}
impl BuiltinSource for Builtin {
fn name(&self) -> String {
match_builtin!(self, builtin, builtin.name())
}
fn ty(&self) -> Ty {
match_builtin!(self, builtin, builtin.ty())
}
fn as_instance(&self, params: &Vec<Ty>) -> CResult<()> {
match_builtin!(self, builtin, builtin.as_instance(params))
}
fn attr(&self, attr: &String) -> Option<(Ty, Ty)> {
match_builtin!(self, builtin, builtin.attr(attr))
}
fn index(&self) -> Option<(Ty, Ty)> {
match_builtin!(self, builtin, builtin.index())
}
fn static_attr(&self, attr: &String) -> Option<Ty> {
match_builtin!(self, builtin, builtin.static_attr(attr))
}
fn casted(&self, ty: &Ty) -> Option<(Ty, Ty)> {
match_builtin!(self, builtin, builtin.casted(ty))
}
}