use thiserror::Error;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Error, Debug, Clone)]
pub enum Error {
#[error("Invalid rule definition: {0}")]
InvalidRule(String),
#[error("Rule conflict: {0}")]
RuleConflict(String),
#[error("Validation failed: {0}")]
ValidationFailed(String),
#[error("Contradiction: {0}")]
Contradiction(String),
#[error("Proof invalid: {0}")]
InvalidProof(String),
#[error("Unification failed: cannot match {0} with {1}")]
UnificationFailed(String, String),
#[error("Inference loop detected: {0}")]
InferenceLoop(String),
#[error("Max inference depth exceeded: {depth}")]
MaxDepthExceeded { depth: usize },
#[error("Missing precondition: {0}")]
MissingPrecondition(String),
#[error("Graph error: {0}")]
GraphError(String),
#[error("Serialization error: {0}")]
SerializationError(String),
}
impl From<aingle_graph::Error> for Error {
fn from(e: aingle_graph::Error) -> Self {
Error::GraphError(e.to_string())
}
}
impl From<serde_json::Error> for Error {
fn from(e: serde_json::Error) -> Self {
Error::SerializationError(e.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = Error::InvalidRule("missing condition".to_string());
assert!(err.to_string().contains("missing condition"));
}
#[test]
fn test_contradiction_error() {
let err = Error::Contradiction("A and not-A".to_string());
assert!(err.to_string().contains("A and not-A"));
}
}