codama_nodes/contextual_value_nodes/
resolver_value_node.rs1use crate::{AccountValueNode, ArgumentValueNode, CamelCaseString, Docs, HasName};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct ResolverValueNode {
6 pub name: CamelCaseString,
8 #[serde(default, skip_serializing_if = "crate::is_default")]
9 pub docs: Docs,
10
11 #[serde(skip_serializing_if = "crate::is_default")]
13 pub depends_on: Option<Vec<ResolverDependency>>,
14}
15
16impl From<ResolverValueNode> for crate::Node {
17 fn from(val: ResolverValueNode) -> Self {
18 crate::Node::ContextualValue(val.into())
19 }
20}
21
22impl ResolverValueNode {
23 pub fn new<T>(name: T) -> Self
24 where
25 T: Into<CamelCaseString>,
26 {
27 Self {
28 name: name.into(),
29 docs: Docs::default(),
30 depends_on: None,
31 }
32 }
33}
34
35#[node_union]
36pub enum ResolverDependency {
37 Account(AccountValueNode),
38 Argument(ArgumentValueNode),
39}
40
41impl HasName for ResolverValueNode {
42 fn name(&self) -> &CamelCaseString {
43 &self.name
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn new() {
53 let node = ResolverValueNode::new("my_resolver");
54 assert_eq!(node.name, CamelCaseString::new("myResolver"));
55 assert_eq!(node.docs, Docs::default());
56 assert_eq!(node.depends_on, None);
57 }
58
59 #[test]
60 fn direct_instantiation() {
61 let node = ResolverValueNode {
62 name: "myResolver".into(),
63 docs: vec!["I am some resolver docs.".to_string()].into(),
64 depends_on: Some(vec![
65 AccountValueNode::new("myDependentAccount").into(),
66 ArgumentValueNode::new("myDependentArgument").into(),
67 ]),
68 };
69 assert_eq!(node.name, CamelCaseString::new("myResolver"));
70 assert_eq!(
71 node.docs,
72 Docs::from(vec!["I am some resolver docs.".to_string()])
73 );
74 assert_eq!(
75 node.depends_on,
76 Some(vec![
77 ResolverDependency::Account(AccountValueNode::new("myDependentAccount")),
78 ResolverDependency::Argument(ArgumentValueNode::new("myDependentArgument")),
79 ])
80 );
81 }
82
83 #[test]
84 fn to_json() {
85 let node = ResolverValueNode::new("myResolver");
86 let json = serde_json::to_string(&node).unwrap();
87 assert_eq!(json, r#"{"kind":"resolverValueNode","name":"myResolver"}"#);
88 }
89
90 #[test]
91 fn from_json() {
92 let json = r#"{"kind":"resolverValueNode","name":"myResolver"}"#;
93 let node: ResolverValueNode = serde_json::from_str(json).unwrap();
94 assert_eq!(node, ResolverValueNode::new("myResolver"));
95 }
96}