jarq 0.7.5

An interactive jq-like JSON query tool with a TUI
Documentation
use simd_json::OwnedValue as Value;
use thiserror::Error;

use crate::utils::type_name;

/// Top-level error for filter operations (parsing or evaluation).
#[derive(Debug, Clone, Error)]
pub enum FilterError {
    #[error("{0}")]
    Parse(#[from] ParseError),
    #[error("{0}")]
    Eval(#[from] EvalError),
}

/// Error during filter parsing.
#[derive(Debug, Clone, PartialEq, Error)]
#[error("{message}")]
pub struct ParseError {
    pub message: String,
    pub position: usize,
}

/// Error during filter evaluation.
#[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,
        }
    }
}

/// Error during JSON loading.
#[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,
}