1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use pest::error::InputLocation;
use thiserror::Error;

use crate::schema::ValueType;

use super::parser::Rule;

#[derive(Error, Debug, Clone, PartialEq, Eq)]
pub enum FilterError {
    #[error("failed to parse filter from `{start}` to `{end}`")]
    Parse { start: usize, end: usize },
    #[error("invalid filter value `{0}`")]
    InvalidNumber(String),
    #[error("expected filter type `{expected}`, but got `{actual}`")]
    InvalidType {
        expected: ValueType,
        actual: ValueType,
    },
    #[error("incomparable filter type `{0}`")]
    IncomparableType(ValueType),
    #[error("expected a filter value")]
    ExpectedValue,
}

pub type FilterResult<T> = Result<T, FilterError>;

impl From<pest::error::Error<Rule>> for FilterError {
    fn from(err: pest::error::Error<Rule>) -> Self {
        match err.location {
            InputLocation::Pos(pos) => Self::Parse {
                start: pos,
                end: pos,
            },
            InputLocation::Span(span) => Self::Parse {
                start: span.0,
                end: span.1,
            },
        }
    }
}