use simd_json::OwnedValue as Value;
use thiserror::Error;
use crate::utils::type_name;
#[derive(Debug, Clone, Error)]
pub enum FilterError {
#[error("{0}")]
Parse(#[from] ParseError),
#[error("{0}")]
Eval(#[from] EvalError),
}
#[derive(Debug, Clone, PartialEq, Error)]
#[error("{message}")]
pub struct ParseError {
pub message: String,
pub position: usize,
}
#[derive(Debug, Clone, Error)]
pub enum EvalError {
#[error("cannot iterate over {}", type_name(value))]
CannotIterate { value: Value, position: usize },
#[error("{message}")]
TypeError { message: String, position: usize },
}
impl EvalError {
pub fn position(&self) -> usize {
match self {
EvalError::CannotIterate { position, .. } => *position,
EvalError::TypeError { position, .. } => *position,
}
}
pub fn set_position(&mut self, pos: usize) {
match self {
EvalError::CannotIterate { position, .. } => *position = pos,
EvalError::TypeError { position, .. } => *position = pos,
}
}
}
#[derive(Debug, Error)]
pub enum LoadError {
#[error("failed to read file: {0}")]
Io(#[from] std::io::Error),
#[error("invalid JSON on line {line}: {message}")]
ParseLine { line: usize, message: String },
#[error("empty input is not valid JSON")]
EmptyInput,
#[error("no valid JSON found in input")]
NoValidJson,
}