1use crate::tokenizer;
2use crate::Token;
3
4#[derive(thiserror::Error, Debug)]
6pub enum ParseError {
7 #[error("parse error near token: {}", .0.location().start)]
9 ParsingNearToken(Token),
10
11 #[error("parse error at end of input")]
13 ParsingAtEndOfInput,
14
15 #[error("failed to tokenize input")]
17 Tokenizing {
18 inner: tokenizer::TokenizerError,
20 position: Option<tokenizer::SourcePosition>,
22 },
23}
24
25#[derive(Debug, thiserror::Error)]
27pub enum WordParseError {
28 #[error("failed to parse arithmetic expression")]
30 ArithmeticExpression(peg::error::ParseError<peg::str::LineCol>),
31
32 #[error("failed to parse pattern")]
34 Pattern(peg::error::ParseError<peg::str::LineCol>),
35
36 #[error("failed to parse prompt string")]
38 Prompt(peg::error::ParseError<peg::str::LineCol>),
39
40 #[error("failed to parse parameter '{0}'")]
42 Parameter(String, peg::error::ParseError<peg::str::LineCol>),
43
44 #[error("failed to parse for brace expansion: '{0}'")]
46 BraceExpansion(String, peg::error::ParseError<peg::str::LineCol>),
47
48 #[error("failed to parse word '{0}'")]
50 Word(String, peg::error::ParseError<peg::str::LineCol>),
51}
52
53#[derive(Debug, thiserror::Error)]
55pub enum TestCommandParseError {
56 #[error("failed to parse test command")]
58 TestCommand(peg::error::ParseError<usize>),
59}
60
61pub(crate) fn convert_peg_parse_error(
62 err: peg::error::ParseError<usize>,
63 tokens: &[Token],
64) -> ParseError {
65 let approx_token_index = err.location;
66
67 if approx_token_index < tokens.len() {
68 ParseError::ParsingNearToken(tokens[approx_token_index].clone())
69 } else {
70 ParseError::ParsingAtEndOfInput
71 }
72}