Skip to main content

spark/
error.rs

1//! Spark error type.
2
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum Error {
7    #[error("unknown component: {0}")]
8    UnknownComponent(String),
9
10    #[error("unknown method `{method}` on component `{class}`")]
11    UnknownMethod { class: String, method: String },
12
13    #[error("invalid arguments for `{method}`: {message}")]
14    InvalidArguments { method: String, message: String },
15
16    #[error("snapshot decode failed: {0}")]
17    SnapshotDecode(String),
18
19    #[error("snapshot checksum mismatch")]
20    SnapshotTampered,
21
22    #[error("snapshot too large: {size} bytes (max {max})")]
23    SnapshotTooLarge { size: usize, max: usize },
24
25    #[error("template error: {0}")]
26    Template(String),
27
28    #[error("io: {0}")]
29    Io(#[from] std::io::Error),
30
31    #[error("serde: {0}")]
32    Serde(#[from] serde_json::Error),
33}
34
35pub type Result<T> = std::result::Result<T, Error>;
36
37impl From<Error> for anvil_core::Error {
38    fn from(e: Error) -> Self {
39        match &e {
40            Error::SnapshotTampered => anvil_core::Error::forbidden("snapshot tampered"),
41            Error::SnapshotTooLarge { .. } => anvil_core::Error::bad_request(format!("{e}")),
42            Error::SnapshotDecode(msg) => {
43                anvil_core::Error::bad_request(format!("snapshot decode: {msg}"))
44            }
45            Error::UnknownComponent(c) => {
46                anvil_core::Error::bad_request(format!("unknown component: {c}"))
47            }
48            Error::UnknownMethod { class, method } => {
49                anvil_core::Error::bad_request(format!("unknown method `{method}` on `{class}`"))
50            }
51            Error::InvalidArguments { method, message } => {
52                anvil_core::Error::bad_request(format!("invalid args for {method}: {message}"))
53            }
54            Error::Template(t) => anvil_core::Error::Internal(format!("template: {t}")),
55            Error::Io(_) | Error::Serde(_) => anvil_core::Error::Internal(format!("{e}")),
56        }
57    }
58}