token_read/
error.rs

1use std::io;
2use thiserror::Error;
3
4#[cfg(doc)]
5use crate::reader::TokenReader;
6
7/// An error returned from [`TokenReader::line`].
8#[derive(Error, Debug)]
9pub enum ReadTokensError<E> {
10    #[error("input error")]
11    IoError { source: io::Error },
12    #[error("unexpected end of file")]
13    EndOfFile,
14    #[error("failed to parse line of tokens: \"{line}\"")]
15    ParseError { source: E, line: String },
16}
17
18/// An error returned from [`TokenReader::line_raw`].
19#[derive(Error, Debug)]
20pub enum ReadLineError {
21    #[error("input error")]
22    IoError { source: io::Error },
23    #[error("unexpected end of file")]
24    EndOfFile,
25}
26
27/// An error returned when parsing a constant amount of tokens.
28///
29/// This error can be returned in two situations:
30///
31/// * There are too many or to few token
32/// * Any of the tokens fail to parse
33#[derive(Error, Debug)]
34pub enum ParseTokenPatternError<E> {
35    #[error("failed to parse token")]
36    ParseError { source: E },
37    #[error("got more than {expected} tokens")]
38    TooManyTokens { expected: usize },
39    #[error("got {real} tokens, expected {expected}")]
40    TooFewTokens { real: usize, expected: usize },
41}
42
43impl<E> From<ReadLineError> for ReadTokensError<E> {
44    fn from(value: ReadLineError) -> Self {
45        match value {
46            ReadLineError::IoError { source } => ReadTokensError::IoError { source },
47            ReadLineError::EndOfFile => ReadTokensError::EndOfFile,
48        }
49    }
50}