codama_nodes/link_nodes/
program_link_node.rs

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