1use std::fmt;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct Pos {
6 pub line: usize,
7 pub col: usize,
8}
9
10impl fmt::Display for Pos {
11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12 write!(f, "{}:{}", self.line, self.col)
13 }
14}
15
16#[derive(Debug, Clone, PartialEq)]
18pub struct Error {
19 pub kind: ErrorKind,
20 pub pos: Option<Pos>,
21 pub message: String,
22}
23
24impl fmt::Display for Error {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 if let Some(pos) = &self.pos {
27 write!(f, "[{}] {}: {}", pos, self.kind, self.message)
28 } else {
29 write!(f, "{}: {}", self.kind, self.message)
30 }
31 }
32}
33
34impl std::error::Error for Error {}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub enum ErrorKind {
38 InvalidHeader,
40 UnsupportedVersion,
42 InvalidSchema,
44 InvalidType,
46 TypeMismatch,
48 InvalidRecord,
50 InvalidString,
52 InvalidArray,
54 InvalidMap,
56 InvalidDirective,
58 InvalidBlock,
60 InvalidTemplate,
62 DuplicateField,
64 DuplicateSectionId,
66 RecordWithoutSchema,
68 UnexpectedEof,
70 ByteOrderMark,
72}
73
74impl fmt::Display for ErrorKind {
75 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76 match self {
77 ErrorKind::InvalidHeader => write!(f, "invalid header"),
78 ErrorKind::UnsupportedVersion => write!(f, "unsupported version"),
79 ErrorKind::InvalidSchema => write!(f, "invalid schema"),
80 ErrorKind::InvalidType => write!(f, "invalid type"),
81 ErrorKind::TypeMismatch => write!(f, "type mismatch"),
82 ErrorKind::InvalidRecord => write!(f, "invalid record"),
83 ErrorKind::InvalidString => write!(f, "invalid string"),
84 ErrorKind::InvalidArray => write!(f, "invalid array"),
85 ErrorKind::InvalidMap => write!(f, "invalid map"),
86 ErrorKind::InvalidDirective => write!(f, "invalid directive"),
87 ErrorKind::InvalidBlock => write!(f, "invalid block"),
88 ErrorKind::InvalidTemplate => write!(f, "invalid template"),
89 ErrorKind::DuplicateField => write!(f, "duplicate field"),
90 ErrorKind::DuplicateSectionId => write!(f, "duplicate section id"),
91 ErrorKind::RecordWithoutSchema => write!(f, "record without schema"),
92 ErrorKind::UnexpectedEof => write!(f, "unexpected end of input"),
93 ErrorKind::ByteOrderMark => write!(f, "byte order mark"),
94 }
95 }
96}
97
98pub type Result<T> = std::result::Result<T, Error>;
99
100pub(crate) fn err(kind: ErrorKind, line: usize, msg: impl Into<String>) -> Error {
101 Error {
102 kind,
103 pos: Some(Pos { line, col: 0 }),
104 message: msg.into(),
105 }
106}