codama_nodes/
error_node.rs

1use crate::{CamelCaseString, Docs, HasName};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ErrorNode {
6    // Data.
7    pub name: CamelCaseString,
8    pub code: usize,
9    pub message: String,
10    #[serde(default, skip_serializing_if = "crate::is_default")]
11    pub docs: Docs,
12}
13
14impl HasName for ErrorNode {
15    fn name(&self) -> &CamelCaseString {
16        &self.name
17    }
18}
19
20impl ErrorNode {
21    pub fn new<T, U>(name: T, code: usize, message: U) -> Self
22    where
23        T: Into<CamelCaseString>,
24        U: Into<String>,
25    {
26        Self {
27            name: name.into(),
28            code,
29            message: message.into(),
30            docs: Docs::default(),
31        }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn new() {
41        let node = ErrorNode::new("myError", 42, "Something went wrong");
42        assert_eq!(node.name, CamelCaseString::new("myError"));
43        assert_eq!(node.code, 42);
44        assert_eq!(node.message, "Something went wrong".to_string());
45        assert_eq!(node.docs, Docs::default());
46    }
47
48    #[test]
49    fn direct_instantiation() {
50        let node = ErrorNode {
51            name: "myError".into(),
52            code: 42,
53            message: "Something went wrong".into(),
54            docs: Docs::default(),
55        };
56        assert_eq!(node.name, CamelCaseString::new("myError"));
57        assert_eq!(node.code, 42);
58        assert_eq!(node.message, "Something went wrong".to_string());
59        assert_eq!(node.docs, Docs::default());
60    }
61
62    #[test]
63    fn to_json() {
64        let node = ErrorNode::new("myError", 42, "Something went wrong");
65        let json = serde_json::to_string(&node).unwrap();
66        assert_eq!(
67            json,
68            r#"{"kind":"errorNode","name":"myError","code":42,"message":"Something went wrong"}"#
69        );
70    }
71
72    #[test]
73    fn from_json() {
74        let json =
75            r#"{"kind":"errorNode","name":"myError","code":42,"message":"Something went wrong"}"#;
76        let node: ErrorNode = serde_json::from_str(json).unwrap();
77        assert_eq!(node, ErrorNode::new("myError", 42, "Something went wrong"));
78    }
79}