use crate::inventory::{FunctionId, Inventory, TypeId};
use crate::lang::meta::{Docs, Emission, Visibility};
pub unsafe trait FunctionInfo {
fn id() -> FunctionId;
fn signature() -> Signature;
fn function() -> Function;
fn register(inventory: &mut impl Inventory);
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Argument {
pub name: String,
pub ty: TypeId,
}
impl Argument {
pub fn new(name: impl AsRef<str>, ty: TypeId) -> Self {
Self { name: name.as_ref().to_string(), ty }
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Signature {
pub arguments: Vec<Argument>,
pub rval: TypeId,
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Function {
pub name: String,
pub visibility: Visibility,
pub docs: Docs,
pub emission: Emission,
pub signature: Signature,
}