Skip to main content

rlmesh_spaces/
errors.rs

1use thiserror::Error;
2
3#[derive(Error, Debug)]
4#[non_exhaustive]
5pub enum SpaceError {
6    #[error("{path}: {msg}")]
7    Invalid { path: String, msg: String },
8}
9
10impl SpaceError {
11    /// Build an [`SpaceError::Invalid`] at `path` with `msg`.
12    pub(crate) fn invalid(path: impl Into<String>, msg: impl Into<String>) -> Self {
13        SpaceError::Invalid {
14            path: path.into(),
15            msg: msg.into(),
16        }
17    }
18
19    /// The value path this error is anchored at (advisory; used to dedup
20    /// conformance warnings per path).
21    #[must_use]
22    pub fn path(&self) -> &str {
23        match self {
24            SpaceError::Invalid { path, .. } => path,
25        }
26    }
27}
28
29#[derive(Error, Debug, Clone, PartialEq, Eq)]
30#[non_exhaustive]
31pub enum EnvRuntimeError {
32    #[error("invalid space: {0}")]
33    InvalidSpace(String),
34    #[error("invalid value: {0}")]
35    InvalidValue(String),
36    #[error("runtime error: {0}")]
37    Runtime(String),
38}
39
40macro_rules! err_space {
41    // err_space!(path, msg)
42    ($path:expr, $msg:expr) => {
43        Err(SpaceError::Invalid {
44            path: $path.into(),
45            msg: $msg.into(),
46        })
47    };
48
49    // err_space!(path, name, msg)
50    ($path:expr, $name:expr, $msg:expr) => {
51        Err(SpaceError::Invalid {
52            path: $path.into(),
53            msg: format!("[{}] {}", $name, $msg),
54        })
55    };
56}
57pub(crate) use err_space;