use crate::{
datatype::{
reference::{self, Reference},
DataType, NamedDataType,
},
SpectaID, TypeCollection,
};
mod impls;
mod macros;
#[cfg(feature = "derive")]
mod legacy_impls;
#[derive(Debug, Clone, Copy)]
pub enum Generics<'a> {
Definition,
Provided(&'a [DataType]),
}
impl<'a> Generics<'a> {
#[doc(hidden)] pub const NONE: Self = Self::Provided(&[]);
}
pub trait Type {
fn inline(type_map: &mut TypeCollection, generics: Generics) -> DataType;
fn reference(type_map: &mut TypeCollection, generics: &[DataType]) -> Reference {
reference::inline::<Self>(type_map, generics)
}
}
pub trait NamedType: Type {
fn sid() -> SpectaID;
fn named_data_type(type_map: &mut TypeCollection, generics: &[DataType]) -> NamedDataType;
fn definition_named_data_type(type_map: &mut TypeCollection) -> NamedDataType;
}
pub trait Flatten: Type {}