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