use std::collections::HashMap;
use std::fmt;
use std::sync::Arc;
use serde_json::Value;
use crate::dialect::Dialect;
pub type DocumentResolver = Arc<dyn Fn(&str) -> Option<Value> + Send + Sync>;
pub type FormatValidator = Arc<dyn Fn(&str) -> bool + Send + Sync>;
#[derive(Clone)]
pub struct CompileOptions {
pub default_dialect: Dialect,
pub assert_format: Option<bool>,
pub assert_format_in_legacy_drafts: bool,
pub assert_content: bool,
pub formats: HashMap<String, FormatValidator>,
pub resolve_document: Option<DocumentResolver>,
pub base_uri: Option<String>,
pub entry_point: Option<String>,
pub max_depth: u32,
}
impl Default for CompileOptions {
fn default() -> Self {
CompileOptions {
default_dialect: Dialect::Draft202012,
assert_format: None,
assert_format_in_legacy_drafts: false,
assert_content: true,
formats: HashMap::new(),
resolve_document: None,
base_uri: None,
entry_point: None,
max_depth: 128,
}
}
}
impl fmt::Debug for CompileOptions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CompileOptions")
.field("default_dialect", &self.default_dialect)
.field("assert_format", &self.assert_format)
.field("assert_format_in_legacy_drafts", &self.assert_format_in_legacy_drafts)
.field("assert_content", &self.assert_content)
.field("formats", &self.formats.keys().collect::<Vec<_>>())
.field("resolve_document", &self.resolve_document.is_some())
.field("base_uri", &self.base_uri)
.field("entry_point", &self.entry_point)
.field("max_depth", &self.max_depth)
.finish()
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SchemaCompilationError {
message: String,
}
impl SchemaCompilationError {
pub(crate) fn new(message: impl Into<String>) -> Self {
SchemaCompilationError { message: message.into() }
}
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for SchemaCompilationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for SchemaCompilationError {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SchemaEvaluationDepthError;
impl fmt::Display for SchemaEvaluationDepthError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("The schema recursed in place beyond the maximum depth.")
}
}
impl std::error::Error for SchemaEvaluationDepthError {}