brush_parser/
error.rs

1use crate::tokenizer;
2use crate::Token;
3
4/// Represents an error that occurred while parsing tokens.
5#[derive(thiserror::Error, Debug)]
6pub enum ParseError {
7    /// A parsing error occurred near the given token.
8    #[error("parse error near token: {}", .0.location().start)]
9    ParsingNearToken(Token),
10
11    /// A parsing error occurred at the end of the input.
12    #[error("parse error at end of input")]
13    ParsingAtEndOfInput,
14
15    /// An error occurred while tokenizing the input stream.
16    #[error("failed to tokenize input")]
17    Tokenizing {
18        /// The inner error.
19        inner: tokenizer::TokenizerError,
20        /// Optionally provides the position of the error.
21        position: Option<tokenizer::SourcePosition>,
22    },
23}
24
25/// Represents an error that occurred while parsing a word.
26#[derive(Debug, thiserror::Error)]
27pub enum WordParseError {
28    /// An error occurred while parsing an arithmetic expression.
29    #[error("failed to parse arithmetic expression")]
30    ArithmeticExpression(peg::error::ParseError<peg::str::LineCol>),
31
32    /// An error occurred while parsing a shell pattern.
33    #[error("failed to parse pattern")]
34    Pattern(peg::error::ParseError<peg::str::LineCol>),
35
36    /// An error occurred while parsing a prompt string.
37    #[error("failed to parse prompt string")]
38    Prompt(peg::error::ParseError<peg::str::LineCol>),
39
40    /// An error occurred while parsing a parameter.
41    #[error("failed to parse parameter '{0}'")]
42    Parameter(String, peg::error::ParseError<peg::str::LineCol>),
43
44    /// An error occurred while parsing for brace expansion.
45    #[error("failed to parse for brace expansion: '{0}'")]
46    BraceExpansion(String, peg::error::ParseError<peg::str::LineCol>),
47
48    /// An error occurred while parsing a word.
49    #[error("failed to parse word '{0}'")]
50    Word(String, peg::error::ParseError<peg::str::LineCol>),
51}
52
53/// Represents an error that occurred while parsing a (non-extended) test command.
54#[derive(Debug, thiserror::Error)]
55pub enum TestCommandParseError {
56    /// An error occurred while parsing a test command.
57    #[error("failed to parse test command")]
58    TestCommand(peg::error::ParseError<usize>),
59}
60
61/// Represents an error that occurred while parsing a key-binding specification.
62#[derive(Debug, thiserror::Error)]
63pub enum BindingParseError {
64    /// An unknown error occurred while parsing a key-binding specification.
65    #[error("unknown error while parsing key-binding: '{0}'")]
66    Unknown(String),
67
68    /// A key code was missing from the key-binding specification.
69    #[error("missing key code in key-binding")]
70    MissingKeyCode,
71}
72
73pub(crate) fn convert_peg_parse_error(
74    err: &peg::error::ParseError<usize>,
75    tokens: &[Token],
76) -> ParseError {
77    let approx_token_index = err.location;
78
79    if approx_token_index < tokens.len() {
80        ParseError::ParsingNearToken(tokens[approx_token_index].clone())
81    } else {
82        ParseError::ParsingAtEndOfInput
83    }
84}