Skip to main content

starbase_utils/
json_error.rs

1use crate::fs::FsError;
2use starbase_styles::{Style, Stylize};
3use std::path::PathBuf;
4use thiserror::Error;
5
6/// JSON errors.
7#[cfg(not(feature = "miette"))]
8#[derive(Error, Debug)]
9pub enum JsonError {
10    #[error(transparent)]
11    Fs(#[from] Box<FsError>),
12
13    #[error("Failed to clean comments and trailing commas from JSON.\n{error}")]
14    Clean {
15        #[source]
16        error: Box<std::io::Error>,
17    },
18
19    #[error("Failed to clean comments and trailing commas in JSON file {}.\n{error}", .path.style(Style::Path))]
20    CleanFile {
21        path: PathBuf,
22        #[source]
23        error: Box<std::io::Error>,
24    },
25
26    #[error("Failed to format JSON.\n{error}")]
27    Format {
28        #[source]
29        error: Box<serde_json::Error>,
30    },
31
32    #[error("Failed to parse JSON.\n{error}")]
33    Parse {
34        #[source]
35        error: Box<serde_json::Error>,
36    },
37
38    #[error("Failed to parse JSON file {}.\n{error}", .path.style(Style::Path))]
39    ReadFile {
40        path: PathBuf,
41        #[source]
42        error: Box<serde_json::Error>,
43    },
44
45    #[error("Failed to format JSON for file {}.\n{error}", .path.style(Style::Path))]
46    WriteFile {
47        path: PathBuf,
48        #[source]
49        error: Box<serde_json::Error>,
50    },
51}
52
53/// JSON errors.
54#[cfg(feature = "miette")]
55#[derive(Error, Debug, miette::Diagnostic)]
56pub enum JsonError {
57    #[diagnostic(transparent)]
58    #[error(transparent)]
59    Fs(#[from] Box<FsError>),
60
61    #[diagnostic(code(json::clean))]
62    #[error("Failed to clean comments and trailing commas from JSON.")]
63    Clean {
64        #[source]
65        error: Box<std::io::Error>,
66    },
67
68    #[diagnostic(code(json::clean_file))]
69    #[error("Failed to clean comments and trailing commas in JSON file {}.", .path.style(Style::Path))]
70    CleanFile {
71        path: PathBuf,
72        #[source]
73        error: Box<std::io::Error>,
74    },
75
76    #[diagnostic(code(json::format))]
77    #[error("Failed to format JSON.")]
78    Format {
79        #[source]
80        error: Box<serde_json::Error>,
81    },
82
83    #[diagnostic(code(json::parse))]
84    #[error("Failed to parse JSON.")]
85    Parse {
86        #[source]
87        error: Box<serde_json::Error>,
88    },
89
90    #[diagnostic(code(json::parse_file))]
91    #[error("Failed to parse JSON file {}.", .path.style(Style::Path))]
92    ReadFile {
93        path: PathBuf,
94        #[source]
95        error: Box<serde_json::Error>,
96    },
97
98    #[diagnostic(code(json::format_file))]
99    #[error("Failed to format JSON for file {}.", .path.style(Style::Path))]
100    WriteFile {
101        path: PathBuf,
102        #[source]
103        error: Box<serde_json::Error>,
104    },
105}
106
107impl From<FsError> for JsonError {
108    fn from(e: FsError) -> JsonError {
109        JsonError::Fs(Box::new(e))
110    }
111}