codama_nodes/contextual_value_nodes/
resolver_value_node.rs

1use crate::{AccountValueNode, ArgumentValueNode, CamelCaseString, Docs};
2use codama_nodes_derive::{node, node_union};
3
4#[node]
5pub struct ResolverValueNode {
6    // Data.
7    pub name: CamelCaseString,
8    #[serde(default)]
9    #[serde(skip_serializing_if = "Docs::is_empty")]
10    pub docs: Docs,
11
12    // Children.
13    #[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}