1use std::{error::Error as StdError, fmt};
2
3#[derive(Debug)]
5pub enum Error {
6 Io(std::io::Error),
7 Parse(Box<pest::error::Error<synapse_parser::synapse::Rule>>),
8 Codegen(synapse_codegen_cfs::CodegenError),
9 Import(String),
10 Manifest(String),
11 Mission(String),
12}
13
14impl fmt::Display for Error {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16 match self {
17 Error::Io(_) | Error::Parse(_) | Error::Codegen(_) => fmt_source_error(self, f),
18 Error::Import(_) | Error::Manifest(_) | Error::Mission(_) => fmt_message_error(self, f),
19 }
20 }
21}
22
23fn fmt_source_error(error: &Error, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 match error {
25 Error::Io(e) => write!(f, "{e}"),
26 Error::Parse(e) => write!(f, "{e}"),
27 Error::Codegen(e) => write!(f, "{e}"),
28 Error::Import(_) | Error::Manifest(_) | Error::Mission(_) => {
29 unreachable!("non-source error")
30 }
31 }
32}
33
34fn fmt_message_error(error: &Error, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35 match error {
36 Error::Import(e) | Error::Manifest(e) | Error::Mission(e) => write!(f, "{e}"),
37 Error::Io(_) | Error::Parse(_) | Error::Codegen(_) => unreachable!("non-message error"),
38 }
39}
40
41impl StdError for Error {
42 fn source(&self) -> Option<&(dyn StdError + 'static)> {
43 match self {
44 Error::Io(e) => Some(e),
45 Error::Parse(e) => Some(e),
46 Error::Codegen(e) => Some(e),
47 Error::Import(_) | Error::Manifest(_) | Error::Mission(_) => None,
48 }
49 }
50}
51
52impl From<std::io::Error> for Error {
53 fn from(value: std::io::Error) -> Self {
54 Error::Io(value)
55 }
56}
57
58impl From<pest::error::Error<synapse_parser::synapse::Rule>> for Error {
59 fn from(value: pest::error::Error<synapse_parser::synapse::Rule>) -> Self {
60 Error::Parse(Box::new(value))
61 }
62}
63
64impl From<synapse_codegen_cfs::CodegenError> for Error {
65 fn from(value: synapse_codegen_cfs::CodegenError) -> Self {
66 Error::Codegen(value)
67 }
68}