Skip to main content

cfs_synapse/
errors.rs

1use std::{error::Error as StdError, fmt};
2
3/// Error type returned by the Synapse library facade.
4#[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}