1use serde::{Deserialize, Serialize};
2use thiserror::Error;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum ParseErrorKind {
7 InvalidYaml,
8 InvalidJson,
9 InvalidDocument,
10 UnsupportedScalar,
11}
12
13#[derive(Debug, Error, PartialEq, Eq)]
14pub enum ParseError {
15 #[error("{field}: YAML parse failed: {message}")]
16 InvalidYaml { field: String, message: String },
17 #[error("{field}: JSON parse failed: {message}")]
18 InvalidJson { field: String, message: String },
19 #[error("{field}: {message}")]
20 InvalidDocument { field: String, message: String },
21 #[error("{field}: scalar form is outside the parser parity subset: {literal}")]
22 UnsupportedScalar { field: String, literal: String },
23}
24
25impl ParseError {
26 #[must_use]
27 pub const fn kind(&self) -> ParseErrorKind {
28 match self {
29 Self::InvalidYaml { .. } => ParseErrorKind::InvalidYaml,
30 Self::InvalidJson { .. } => ParseErrorKind::InvalidJson,
31 Self::InvalidDocument { .. } => ParseErrorKind::InvalidDocument,
32 Self::UnsupportedScalar { .. } => ParseErrorKind::UnsupportedScalar,
33 }
34 }
35}
36
37#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
38#[serde(rename_all = "snake_case")]
39pub enum ValidationErrorKind {
40 MissingField,
41 InvalidField,
42}
43
44#[derive(Debug, Error, PartialEq, Eq)]
45pub enum ValidationError {
46 #[error("{field} is required.")]
47 MissingField { field: String },
48 #[error("{message}")]
49 InvalidField { field: String, message: String },
50}
51
52impl ValidationError {
53 #[must_use]
54 pub const fn kind(&self) -> ValidationErrorKind {
55 match self {
56 Self::MissingField { .. } => ValidationErrorKind::MissingField,
57 Self::InvalidField { .. } => ValidationErrorKind::InvalidField,
58 }
59 }
60}