1#[cfg(not(feature = "std"))]
2pub use thiserror_no_std::Error as ThisError;
3#[cfg(feature = "std")]
4pub use thiserror::Error as ThisError;
5use crate::std::*;
6
7
8pub type JResult<O, E = Error> = Result<O, E>;
9
10
11#[derive(Debug, PartialEq, Eq)]
12pub struct Error {
13 pub position: usize,
14 pub code: ErrorKind,
15}
16
17
18impl Error {
19 pub fn new(position: usize, kind: ErrorKind) -> Self {
20 Self { position, code: kind }
21 }
22}
23
24
25impl fmt::Display for Error {
26 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27 write!(f, "[ERROR]: {}, position: {}", self.code, self.position)
28 }
29}
30
31
32pub trait ParseError {
33 fn from_error_kind(position: usize, kind: ErrorKind) -> Self;
34}
35
36
37impl ParseError for Error {
38 fn from_error_kind(position: usize, kind: ErrorKind) -> Self {
39 Error::new(position, kind)
40 }
41}
42
43
44#[derive(Debug, PartialEq, Eq, ThisError)]
45pub enum ErrorKind {
46 #[error("invalid byte length")]
47 InvalidByteLength,
48 #[error("find subsequence failure")]
49 SubSequence,
50 #[error("parse byte failure")]
51 Fail,
52 #[error("invalid position ({0})")]
53 InvalidPosition(usize),
54 #[error("invalid buffer memory")]
55 PushFail,
56 #[error("invalid value ({0})")]
57 InvalidValue(String),
58}
59
60
61#[inline]
62pub fn make_error<E: ParseError>(position: usize, kind: ErrorKind) -> E {
63 E::from_error_kind(position, kind)
64}