use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DiagnosticSeverity {
Error,
Warning,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Diagnostic {
pub severity: DiagnosticSeverity,
pub code: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
pub message: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ParseErrorKind {
Syntax,
TypeMismatch,
UnknownVariant,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ParseError {
pub kind: ParseErrorKind,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub line: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub column: Option<usize>,
}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let (Some(line), Some(col)) = (self.line, self.column) {
write!(f, "{}:{}: {}", line, col, self.message)
} else {
write!(f, "{}", self.message)
}
}
}
impl std::error::Error for ParseError {}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ValidationError {
pub rule: String,
pub spec_ref: String,
pub path: String,
pub message: String,
}
impl fmt::Display for ValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{} ({}) at {}: {}",
self.rule, self.spec_ref, self.path, self.message
)
}
}
impl std::error::Error for ValidationError {}
#[derive(Clone, Debug, Default)]
pub struct ValidationResult {
pub errors: Vec<ValidationError>,
pub warnings: Vec<Diagnostic>,
}
impl ValidationResult {
pub fn is_valid(&self) -> bool {
self.errors.is_empty()
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EvaluationErrorKind {
PathResolution,
RegexTimeout,
CelError,
TypeError,
SemanticError,
UnsupportedMethod,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EvaluationError {
pub kind: EvaluationErrorKind,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub indicator_id: Option<String>,
}
impl fmt::Display for EvaluationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl std::error::Error for EvaluationError {}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum GenerationErrorKind {
ProviderUnavailable,
ModelError,
ValidationFailure,
Timeout,
ContentPolicy,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct GenerationError {
pub kind: GenerationErrorKind,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt_preview: Option<String>,
}
impl fmt::Display for GenerationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl std::error::Error for GenerationError {}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SerializeError {
pub message: String,
}
impl fmt::Display for SerializeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl std::error::Error for SerializeError {}
#[derive(Clone, Debug)]
pub enum OATFError {
Parse(ParseError),
Validation(ValidationError),
}
impl fmt::Display for OATFError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
OATFError::Parse(e) => write!(f, "Parse error: {}", e),
OATFError::Validation(e) => write!(f, "Validation error: {}", e),
}
}
}
impl std::error::Error for OATFError {}