corvus_json_schema/
options.rs1use std::collections::HashMap;
4use std::fmt;
5use std::sync::Arc;
6
7use serde_json::Value;
8
9use crate::dialect::Dialect;
10
11pub type DocumentResolver = Arc<dyn Fn(&str) -> Option<Value> + Send + Sync>;
13
14pub type FormatValidator = Arc<dyn Fn(&str) -> bool + Send + Sync>;
16
17#[derive(Clone)]
19pub struct CompileOptions {
20 pub default_dialect: Dialect,
22 pub assert_format: Option<bool>,
25 pub assert_format_in_legacy_drafts: bool,
27 pub assert_content: bool,
29 pub formats: HashMap<String, FormatValidator>,
31 pub resolve_document: Option<DocumentResolver>,
33 pub base_uri: Option<String>,
35 pub entry_point: Option<String>,
37 pub max_depth: u32,
39}
40
41impl Default for CompileOptions {
42 fn default() -> Self {
43 CompileOptions {
44 default_dialect: Dialect::Draft202012,
45 assert_format: None,
46 assert_format_in_legacy_drafts: false,
47 assert_content: true,
48 formats: HashMap::new(),
49 resolve_document: None,
50 base_uri: None,
51 entry_point: None,
52 max_depth: 128,
53 }
54 }
55}
56
57impl fmt::Debug for CompileOptions {
58 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 f.debug_struct("CompileOptions")
60 .field("default_dialect", &self.default_dialect)
61 .field("assert_format", &self.assert_format)
62 .field("assert_format_in_legacy_drafts", &self.assert_format_in_legacy_drafts)
63 .field("assert_content", &self.assert_content)
64 .field("formats", &self.formats.keys().collect::<Vec<_>>())
65 .field("resolve_document", &self.resolve_document.is_some())
66 .field("base_uri", &self.base_uri)
67 .field("entry_point", &self.entry_point)
68 .field("max_depth", &self.max_depth)
69 .finish()
70 }
71}
72
73#[derive(Clone, Debug, PartialEq, Eq)]
75pub struct SchemaCompilationError {
76 message: String,
77}
78
79impl SchemaCompilationError {
80 pub(crate) fn new(message: impl Into<String>) -> Self {
81 SchemaCompilationError { message: message.into() }
82 }
83
84 pub fn message(&self) -> &str {
86 &self.message
87 }
88}
89
90impl fmt::Display for SchemaCompilationError {
91 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
92 f.write_str(&self.message)
93 }
94}
95
96impl std::error::Error for SchemaCompilationError {}
97
98#[derive(Clone, Copy, Debug, PartialEq, Eq)]
100pub struct SchemaEvaluationDepthError;
101
102impl fmt::Display for SchemaEvaluationDepthError {
103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104 f.write_str("The schema recursed in place beyond the maximum depth.")
105 }
106}
107
108impl std::error::Error for SchemaEvaluationDepthError {}