Skip to main content

cards2pack_core/
errors.rs

1//! Typed errors with stable string codes for cross-boundary identification.
2
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum ConvertError {
7    #[error("E_NO_CARDS: no cards provided")]
8    NoCards,
9    #[error("E_NO_ENTRY: cannot detect entry card from {count} cards")]
10    NoEntryCard { count: usize },
11    #[error("E_DANGLING_ROUTE: card '{from}' routes to unknown card '{to}'")]
12    DanglingRoute { from: String, to: String },
13    #[error("E_INVALID_CARD: card '{id}' is not a valid AdaptiveCard JSON: {msg}")]
14    InvalidCard { id: String, msg: String },
15    #[error("E_INVALID_HTTP: card '{id}' has invalid HTTP config: {msg}")]
16    InvalidHttp { id: String, msg: String },
17    #[error("E_PARSE: cannot parse cards JSON: {0}")]
18    Parse(String),
19    #[error("E_EMIT: cannot serialize flow YAML: {0}")]
20    Emit(String),
21}
22
23impl ConvertError {
24    pub fn code(&self) -> &'static str {
25        match self {
26            ConvertError::NoCards => "E_NO_CARDS",
27            ConvertError::NoEntryCard { .. } => "E_NO_ENTRY",
28            ConvertError::DanglingRoute { .. } => "E_DANGLING_ROUTE",
29            ConvertError::InvalidCard { .. } => "E_INVALID_CARD",
30            ConvertError::InvalidHttp { .. } => "E_INVALID_HTTP",
31            ConvertError::Parse(_) => "E_PARSE",
32            ConvertError::Emit(_) => "E_EMIT",
33        }
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn code_round_trip() {
43        assert_eq!(ConvertError::NoCards.code(), "E_NO_CARDS");
44        assert_eq!(ConvertError::NoEntryCard { count: 0 }.code(), "E_NO_ENTRY");
45        assert_eq!(
46            ConvertError::DanglingRoute {
47                from: "a".into(),
48                to: "b".into()
49            }
50            .code(),
51            "E_DANGLING_ROUTE"
52        );
53    }
54}