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)
-    }
-}