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