use crate::std::primitives::{BuiltInInterfaceKind, BuiltInModelKind, BuiltInScalarKind};
pub fn is_builtin_scalar(name: &str) -> bool {
get_builtin_scalar_kind(name).is_some()
}
pub fn get_builtin_scalar_kind(name: &str) -> Option<BuiltInScalarKind> {
match name {
"bytes" => Some(BuiltInScalarKind::Bytes),
"string" => Some(BuiltInScalarKind::String),
"boolean" => Some(BuiltInScalarKind::Boolean),
"numeric" => Some(BuiltInScalarKind::Numeric),
"integer" => Some(BuiltInScalarKind::Integer),
"int64" => Some(BuiltInScalarKind::Int64),
"int32" => Some(BuiltInScalarKind::Int32),
"int16" => Some(BuiltInScalarKind::Int16),
"int8" => Some(BuiltInScalarKind::Int8),
"uint64" => Some(BuiltInScalarKind::Uint64),
"uint32" => Some(BuiltInScalarKind::Uint32),
"uint16" => Some(BuiltInScalarKind::Uint16),
"uint8" => Some(BuiltInScalarKind::Uint8),
"safeint" => Some(BuiltInScalarKind::Safeint),
"float" => Some(BuiltInScalarKind::Float),
"float64" => Some(BuiltInScalarKind::Float64),
"float32" => Some(BuiltInScalarKind::Float32),
"decimal" => Some(BuiltInScalarKind::Decimal),
"decimal128" => Some(BuiltInScalarKind::Decimal128),
"plainDate" => Some(BuiltInScalarKind::PlainDate),
"plainTime" => Some(BuiltInScalarKind::PlainTime),
"utcDateTime" => Some(BuiltInScalarKind::UtcDateTime),
"offsetDateTime" => Some(BuiltInScalarKind::OffsetDateTime),
"duration" => Some(BuiltInScalarKind::Duration),
"url" => Some(BuiltInScalarKind::Url),
"unixTimestamp32" => Some(BuiltInScalarKind::UnixTimestamp32),
_ => None,
}
}
pub fn is_builtin_model(name: &str) -> bool {
matches!(name, "Array" | "Record")
}
pub fn get_builtin_model_kind(name: &str) -> Option<BuiltInModelKind> {
match name {
"Array" => Some(BuiltInModelKind::Array),
"Record" => Some(BuiltInModelKind::Record),
_ => None,
}
}
pub fn is_builtin_interface(name: &str) -> bool {
matches!(name, "ModelProperty" | "Operation" | "Array")
}
pub fn get_builtin_interface_kind(name: &str) -> Option<BuiltInInterfaceKind> {
match name {
"ModelProperty" => Some(BuiltInInterfaceKind::ModelProperty),
"Operation" => Some(BuiltInInterfaceKind::Operation),
"Array" => Some(BuiltInInterfaceKind::ArrayInterface),
_ => None,
}
}
pub use crate::libs::compiler::TYPESPEC_NAMESPACE;
pub const PROTOTYPES_NAMESPACE: &str = "TypeSpec.Prototypes";
pub fn is_builtin_namespace(name: &str) -> bool {
name == TYPESPEC_NAMESPACE || name == PROTOTYPES_NAMESPACE || name == "TypeSpec.Reflection"
}
pub fn get_scalar_hierarchy() -> &'static [(&'static str, Option<&'static str>)] {
super::primitives::SCALAR_HIERARCHY
}
pub fn is_scalar_descendant_of(kind: BuiltInScalarKind, ancestor: BuiltInScalarKind) -> bool {
if kind == ancestor {
return true;
}
let mut current = kind.extends();
while let Some(parent) = current {
if parent == ancestor {
return true;
}
current = parent.extends();
}
false
}
pub fn get_scalar_ancestors(kind: BuiltInScalarKind) -> Vec<BuiltInScalarKind> {
let mut ancestors = Vec::new();
let mut current = kind.extends();
while let Some(parent) = current {
ancestors.push(parent);
current = parent.extends();
}
ancestors
}
pub fn has_from_iso_initializer(kind: BuiltInScalarKind) -> bool {
matches!(
kind,
BuiltInScalarKind::PlainDate
| BuiltInScalarKind::PlainTime
| BuiltInScalarKind::UtcDateTime
| BuiltInScalarKind::OffsetDateTime
| BuiltInScalarKind::Duration
)
}
pub fn has_now_initializer(kind: BuiltInScalarKind) -> bool {
matches!(
kind,
BuiltInScalarKind::PlainDate
| BuiltInScalarKind::PlainTime
| BuiltInScalarKind::UtcDateTime
| BuiltInScalarKind::OffsetDateTime
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_builtin_scalar() {
assert!(is_builtin_scalar("string"));
assert!(is_builtin_scalar("int32"));
assert!(is_builtin_scalar("boolean"));
assert!(is_builtin_scalar("duration"));
assert!(!is_builtin_scalar("Foo"));
assert!(!is_builtin_scalar("myType"));
}
#[test]
fn test_get_builtin_scalar_kind() {
assert_eq!(
get_builtin_scalar_kind("string"),
Some(BuiltInScalarKind::String)
);
assert_eq!(
get_builtin_scalar_kind("int32"),
Some(BuiltInScalarKind::Int32)
);
assert_eq!(get_builtin_scalar_kind("unknown"), None);
}
#[test]
fn test_is_builtin_model() {
assert!(is_builtin_model("Array"));
assert!(is_builtin_model("Record"));
assert!(!is_builtin_model("Foo"));
}
#[test]
fn test_get_builtin_model_kind() {
assert_eq!(
get_builtin_model_kind("Array"),
Some(BuiltInModelKind::Array)
);
assert_eq!(
get_builtin_model_kind("Record"),
Some(BuiltInModelKind::Record)
);
assert_eq!(get_builtin_model_kind("Foo"), None);
}
#[test]
fn test_is_builtin_namespace() {
assert!(is_builtin_namespace("TypeSpec"));
assert!(is_builtin_namespace("TypeSpec.Prototypes"));
assert!(!is_builtin_namespace("MyNamespace"));
}
#[test]
fn test_scalar_hierarchy() {
let hierarchy = get_scalar_hierarchy();
let int32_entry = hierarchy.iter().find(|(name, _)| *name == "int32");
assert!(int32_entry.is_some());
assert_eq!(int32_entry.unwrap().1, Some("int64"));
let integer_entry = hierarchy.iter().find(|(name, _)| *name == "integer");
assert!(integer_entry.is_some());
assert_eq!(integer_entry.unwrap().1, Some("numeric"));
}
#[test]
fn test_is_scalar_descendant_of() {
assert!(is_scalar_descendant_of(
BuiltInScalarKind::Int32,
BuiltInScalarKind::Int64
));
assert!(is_scalar_descendant_of(
BuiltInScalarKind::Int32,
BuiltInScalarKind::Integer
));
assert!(is_scalar_descendant_of(
BuiltInScalarKind::Int32,
BuiltInScalarKind::Numeric
));
assert!(is_scalar_descendant_of(
BuiltInScalarKind::String,
BuiltInScalarKind::String
));
assert!(!is_scalar_descendant_of(
BuiltInScalarKind::String,
BuiltInScalarKind::Numeric
));
}
#[test]
fn test_get_scalar_ancestors() {
let ancestors = get_scalar_ancestors(BuiltInScalarKind::Int32);
assert!(ancestors.contains(&BuiltInScalarKind::Int64));
assert!(ancestors.contains(&BuiltInScalarKind::Integer));
assert!(ancestors.contains(&BuiltInScalarKind::Numeric));
let string_ancestors = get_scalar_ancestors(BuiltInScalarKind::String);
assert!(string_ancestors.is_empty());
}
#[test]
fn test_has_from_iso_initializer() {
assert!(has_from_iso_initializer(BuiltInScalarKind::PlainDate));
assert!(has_from_iso_initializer(BuiltInScalarKind::UtcDateTime));
assert!(!has_from_iso_initializer(BuiltInScalarKind::String));
assert!(!has_from_iso_initializer(BuiltInScalarKind::Int32));
}
#[test]
fn test_has_now_initializer() {
assert!(has_now_initializer(BuiltInScalarKind::PlainDate));
assert!(has_now_initializer(BuiltInScalarKind::UtcDateTime));
assert!(!has_now_initializer(BuiltInScalarKind::Duration));
assert!(!has_now_initializer(BuiltInScalarKind::String));
}
}