#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
#[repr(u8)]
pub enum TypeKind {
Void = 0,
Node = 1,
String = 2,
Optional = 3,
ArrayZeroOrMore = 4,
ArrayOneOrMore = 5,
Struct = 6,
Enum = 7,
Alias = 8,
}
impl TypeKind {
pub fn from_u8(v: u8) -> Option<Self> {
match v {
0 => Some(Self::Void),
1 => Some(Self::Node),
2 => Some(Self::String),
3 => Some(Self::Optional),
4 => Some(Self::ArrayZeroOrMore),
5 => Some(Self::ArrayOneOrMore),
6 => Some(Self::Struct),
7 => Some(Self::Enum),
8 => Some(Self::Alias),
_ => None,
}
}
pub fn is_primitive(self) -> bool {
matches!(self, Self::Void | Self::Node | Self::String)
}
pub fn is_wrapper(self) -> bool {
matches!(
self,
Self::Optional | Self::ArrayZeroOrMore | Self::ArrayOneOrMore
)
}
pub fn is_composite(self) -> bool {
matches!(self, Self::Struct | Self::Enum)
}
pub fn is_array(self) -> bool {
matches!(self, Self::ArrayZeroOrMore | Self::ArrayOneOrMore)
}
pub fn array_is_non_empty(self) -> bool {
matches!(self, Self::ArrayOneOrMore)
}
pub fn is_alias(self) -> bool {
matches!(self, Self::Alias)
}
pub fn primitive_name(self) -> Option<&'static str> {
match self {
Self::Void => Some("Void"),
Self::Node => Some("Node"),
Self::String => Some("String"),
_ => None,
}
}
}