diff --git a/src/lib.rs b/src/lib.rs index 5f709e740cc15be7a800378cf1da7118f0b5d264..ad29848273775c465ddfa87c167a4ea1d1764e2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ -use std::fmt::Display; - use jsonschema::{Draft, JSONSchema}; use serde_json::{Map, Value}; +use std::fmt::Display; pub struct Inspector { schema: JSONSchema, @@ -18,7 +17,7 @@ impl Inspector { let target = std::any::type_name::<T>() .split("::") .last() - .ok_or(InitError::UnknownFailure)?; + .ok_or(InitError::InferenceFailure)?; Self::new(target, schemas, resolve_refs) } @@ -27,7 +26,7 @@ impl Inspector { use InitError::*; // extract schemas object let Value::Object(schemas) = schemas else { - return Err(InitError::UnknownFailure); + return Err(InitError::InvalidSchema(None)); }; // extract target from schema let Value::Object(mut target) = schemas @@ -35,12 +34,15 @@ impl Inspector { .ok_or_else(|| SchemaNotFound(target.to_owned()))? .to_owned() else { - return Err(InitError::UnknownFailure); + return Err(InitError::InvalidSchema(None)); }; if resolve_refs { // extract properties - let Value::Object(mut props) = target.remove(Self::PROP).ok_err()? else { - return Err(InitError::UnknownFailure); + let Value::Object(mut props) = target + .remove(Self::PROP) + .ok_or_else(|| InvalidSchema(Some(Self::PROP.to_owned())))? + else { + return Err(InvalidSchema(Some(Self::PROP.to_owned()))); }; Self::resolve_references(schemas, &mut props)?; // reinsert resolved properties @@ -50,8 +52,7 @@ impl Inspector { schema: JSONSchema::options() .with_draft(Draft::Draft202012) .compile(&Value::Object(target)) - .ok() - .ok_err()?, + .map_err(|_| CompileFailure)?, }) } @@ -130,9 +131,10 @@ impl Display for SchemaError { #[derive(Debug)] pub enum InitError { SchemaNotFound(String), - ResolutionFailure(String), + ResolutionFailure(String), // contains the reference that was not resolved + InvalidSchema(Option<String>), // contains the missing field in the schema CompileFailure, - UnknownFailure, + InferenceFailure, } impl std::error::Error for InitError {} @@ -148,21 +150,13 @@ impl Display for InitError { f, "{base} failed to resolve references: referenced schema {schema} was not found" ), - Self::UnknownFailure => write!(f, "{base} unknown failure occured"), + Self::InferenceFailure => write!(f, "{base} name of the type couldn't be inferred"), Self::CompileFailure => write!(f, "{base} failed to compile schema"), + Self::InvalidSchema(schema) => write!( + f, + "{base} invalid schema provided: {} is missing or is not an object", + schema.as_deref().unwrap_or("field") + ), } } } - -trait TempMap<T> -where - Self: Sized, -{ - fn ok_err(self) -> Result<T, InitError>; -} - -impl<T> TempMap<T> for Option<T> { - fn ok_err(self) -> Result<T, InitError> { - self.ok_or(InitError::UnknownFailure) - } -}