codama_nodes/
error_node.rs1use crate::{CamelCaseString, Docs, HasName};
2use codama_nodes_derive::node;
3
4#[node]
5pub struct ErrorNode {
6 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}