use serde::Serialize;
pub mod analysis;
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize)]
pub struct TypeRef(pub(crate) usize);
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize)]
pub struct Record(pub(crate) usize);
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize)]
pub struct ArgsRef(pub(crate) usize);
#[derive(Debug, Serialize, PartialEq, Eq, Hash, Clone, Copy)]
pub struct FunArgs {
pub values: ArgsRef,
pub needed: usize,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize)]
pub enum Type {
#[default]
Unspecified,
Number,
String,
Bool,
Array(TypeRef),
Record(Record),
Subject,
App {
args: FunArgs,
result: TypeRef,
aggregate: bool,
},
Date,
Time,
DateTime,
}
impl Type {
pub fn as_record_or_panic(&self) -> Record {
if let Self::Record(r) = self {
return *r;
}
panic!("expected record type, got {:?}", self);
}
}