diff --git a/schemars/src/error.rs b/schemars/src/error.rs deleted file mode 100644 index 8a0f59e..0000000 --- a/schemars/src/error.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::schema::Schema; -use std::error::Error; -use std::fmt; - -pub type Result = std::result::Result; - -#[derive(Debug, Clone)] -pub struct JsonSchemaError { - msg: &'static str, - schema: Schema, -} - -impl JsonSchemaError { - pub fn new(msg: &'static str, schema: Schema) -> JsonSchemaError { - JsonSchemaError { msg, schema } - } - - pub fn schema(&self) -> &Schema { - &self.schema - } -} - -impl fmt::Display for JsonSchemaError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{} Schema: {:?}", self.msg, self.schema) - } -} - -impl Error for JsonSchemaError {} diff --git a/schemars/src/gen.rs b/schemars/src/gen.rs index c982263..c04c842 100644 --- a/schemars/src/gen.rs +++ b/schemars/src/gen.rs @@ -1,5 +1,5 @@ use crate::schema::*; -use crate::{JsonSchema, JsonSchemaError, Map, Result}; +use crate::{JsonSchema, Map}; #[derive(Debug, PartialEq, Clone)] pub struct SchemaSettings { @@ -133,42 +133,21 @@ impl SchemaGenerator { schema } - pub fn dereference_once<'a>(&'a self, schema: &'a Schema) -> Result<&'a Schema> { + pub fn dereference<'a>(&'a self, schema: &Schema) -> Option<&'a Schema> { match schema { Schema::Object(SchemaObject { reference: Some(ref schema_ref), .. }) => { let definitions_path = &self.settings().definitions_path; - if !schema_ref.starts_with(definitions_path) { - return Err(JsonSchemaError::new( - "Could not extract referenced schema name.", - schema.clone(), - )); - } - - let name = &schema_ref[definitions_path.len()..]; - self.definitions.get(name).ok_or_else(|| { - JsonSchemaError::new("Could not find referenced schema.", schema.clone()) - }) + let name = if schema_ref.starts_with(definitions_path) { + &schema_ref[definitions_path.len()..] + } else { + schema_ref + }; + self.definitions.get(name) } - s => Ok(s), + _ => None, } } - - pub fn dereference<'a>(&'a self, mut schema: &'a Schema) -> Result<&'a Schema> { - if !schema.is_ref() { - return Ok(schema); - } - for _ in 0..100 { - schema = self.dereference_once(schema)?; - if !schema.is_ref() { - return Ok(schema); - } - } - Err(JsonSchemaError::new( - "Failed to dereference schema after 100 iterations - references may be cyclic.", - schema.clone(), - )) - } } diff --git a/schemars/src/lib.rs b/schemars/src/lib.rs index 2f3fe61..7b6d644 100644 --- a/schemars/src/lib.rs +++ b/schemars/src/lib.rs @@ -3,7 +3,6 @@ pub type Map = std::collections::BTreeMap; pub type Set = std::collections::BTreeSet; -mod error; mod flatten; mod json_schema_impls; #[macro_use] @@ -12,7 +11,6 @@ mod macros; pub mod gen; pub mod schema; -pub use error::*; pub use schemars_derive::*; use schema::Schema; diff --git a/schemars/tests/dereference.rs b/schemars/tests/dereference.rs index b4e5c22..b4b6ca9 100644 --- a/schemars/tests/dereference.rs +++ b/schemars/tests/dereference.rs @@ -1,20 +1,6 @@ -mod util; use schemars::{gen::SchemaGenerator, JsonSchema}; use std::ptr; -#[test] -fn dereference_i32() -> util::TestResult { - let mut gen = SchemaGenerator::default(); - let i32_schema = gen.subschema_for::(); - - let dereferenced_once = gen.dereference_once(&i32_schema)?; - assert!(ptr::eq(dereferenced_once, &i32_schema)); - - let dereferenced = gen.dereference(&i32_schema)?; - assert!(ptr::eq(dereferenced, &i32_schema)); - Ok(()) -} - #[derive(Debug, JsonSchema)] pub struct Struct { foo: i32, @@ -22,15 +8,15 @@ pub struct Struct { } #[test] -fn dereference_struct() -> util::TestResult { +fn dereference_struct() { let mut gen = SchemaGenerator::default(); let struct_ref_schema = gen.subschema_for::(); let struct_schema = gen.definitions().get(&::schema_name()).unwrap(); - let dereferenced_once = gen.dereference_once(&struct_ref_schema)?; - assert!(ptr::eq(dereferenced_once, struct_schema)); + assert!(struct_ref_schema.is_ref()); + assert!(!struct_schema.is_ref()); - let dereferenced = gen.dereference(&struct_ref_schema)?; - assert!(ptr::eq(dereferenced, struct_schema)); - Ok(()) + let dereferenced = gen.dereference(&struct_ref_schema); + assert!(dereferenced.is_some()); + assert!(ptr::eq(dereferenced.unwrap(), struct_schema)); }