use serde_json::Value;
use crate::{
canonical::{
ir::{CanonicalJson, SchemaKind},
CanonicalSchema,
},
JsonType, JsonTypeSet,
};
pub use crate::canonical::ir::CanonicalKind;
impl CanonicalKind {
#[must_use]
pub fn as_str(self) -> &'static str {
self.into()
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum CanonicalView {
MultiType(JsonTypeSet),
TypedGroup(TypedGroupView),
Const(Value),
Enum(Vec<Value>),
True,
False,
Raw(Value),
}
#[derive(Debug, Clone, PartialEq)]
pub struct TypedGroupView {
pub ty: JsonType,
pub body: CanonicalSchema,
}
impl CanonicalSchema {
#[must_use]
pub fn view(&self) -> CanonicalView {
match self.schema_kind() {
SchemaKind::MultiType(set) => CanonicalView::MultiType(*set),
SchemaKind::TypedGroup { ty, body } => CanonicalView::TypedGroup(TypedGroupView {
ty: *ty,
body: self.wrap_child(body),
}),
SchemaKind::Const(value) => CanonicalView::Const(value.to_value()),
SchemaKind::Enum(values) => {
CanonicalView::Enum(values.iter().map(CanonicalJson::to_value).collect())
}
SchemaKind::True => CanonicalView::True,
SchemaKind::False => CanonicalView::False,
SchemaKind::Raw(_) => CanonicalView::Raw(self.to_json_schema()),
}
}
#[must_use]
pub fn kind(&self) -> CanonicalKind {
self.schema_kind().into()
}
}