use std::any::TypeId;
use std::ffi::OsString;
use std::path::PathBuf;
use std::sync::OnceLock;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SchemaType {
Boolean,
Integer,
Number,
String,
StringPath,
Array,
Object,
}
impl SchemaType {
#[must_use]
pub const fn as_json_type(self) -> &'static str {
match self {
Self::Boolean => "boolean",
Self::Integer => "integer",
Self::Number => "number",
Self::String | Self::StringPath => "string",
Self::Array => "array",
Self::Object => "object",
}
}
}
pub fn known_type_classifications() -> &'static [(TypeId, SchemaType)] {
static TABLE: OnceLock<Vec<(TypeId, SchemaType)>> = OnceLock::new();
TABLE.get_or_init(|| {
vec![
(TypeId::of::<i8>(), SchemaType::Integer),
(TypeId::of::<i16>(), SchemaType::Integer),
(TypeId::of::<i32>(), SchemaType::Integer),
(TypeId::of::<i64>(), SchemaType::Integer),
(TypeId::of::<isize>(), SchemaType::Integer),
(TypeId::of::<u8>(), SchemaType::Integer),
(TypeId::of::<u16>(), SchemaType::Integer),
(TypeId::of::<u32>(), SchemaType::Integer),
(TypeId::of::<u64>(), SchemaType::Integer),
(TypeId::of::<usize>(), SchemaType::Integer),
(TypeId::of::<f32>(), SchemaType::Number),
(TypeId::of::<f64>(), SchemaType::Number),
(TypeId::of::<bool>(), SchemaType::Boolean),
(TypeId::of::<String>(), SchemaType::String),
(TypeId::of::<PathBuf>(), SchemaType::StringPath),
(TypeId::of::<OsString>(), SchemaType::StringPath),
]
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn as_json_type_renders_correctly() {
assert_eq!(SchemaType::Boolean.as_json_type(), "boolean");
assert_eq!(SchemaType::Integer.as_json_type(), "integer");
assert_eq!(SchemaType::Number.as_json_type(), "number");
assert_eq!(SchemaType::String.as_json_type(), "string");
assert_eq!(SchemaType::StringPath.as_json_type(), "string");
assert_eq!(SchemaType::Array.as_json_type(), "array");
assert_eq!(SchemaType::Object.as_json_type(), "object");
}
}