icentral_json/
json_builder.rs

1crate::ix!();
2
3#[macro_export] macro_rules! allow_twolevel_named_members {
4
5    ($($outer_type:ident [ $fn_name:ident ] $inner_type:ident [ $inner_type_constructor:ident ]);*) => {
6        $(
7            allow_twolevel_named_member!($outer_type [ $fn_name ] $inner_type [ $inner_type_constructor ] );
8        )*
9    }
10}
11
12/// $outer_type and $inner_type need to be
13/// a variant of
14/// betweenness_json_builder::ParentAddress and
15/// betweenness_json_builder::ChildAddress
16/// respectively
17///
18/// $inner_type_constructor needs to be
19/// implemented for $inner_type and accept &str as
20/// input
21///
22/// $fn_name is ultimately what we can use to
23/// call this functionality as a struct method
24/// from OuterType
25#[macro_export] macro_rules! allow_twolevel_named_member {
26
27    ($outer_type:ident [ $fn_name:ident ] $inner_type:ident [ $inner_type_constructor:ident ]) => {
28
29        impl $outer_type {
30
31            pub fn $fn_name(parent: &str, child: &str) -> $inner_type {
32
33                let parent_address = betweenness_json_builder::ParentAddress::$outer_type { 
34                    name: parent.to_owned() 
35                };
36
37                let child_address = betweenness_json_builder::ChildAddress::$inner_type { 
38                    name: child.to_owned() 
39                };
40
41                let name = BetweennessJsonBuilder::new(
42                    parent_address,
43                    child_address
44                ).to_json();
45
46                $inner_type::$inner_type_constructor(&name)
47            }
48        }
49    }
50}
51
52pub mod betweenness_json_builder {
53
54    use super::*;
55
56    #[derive(Serialize)]
57    pub enum ParentAddress {
58        GraphHash         { name: String },
59        Graph             { name: String },
60        SubGraph          { name: String },
61        MinimumUnionCycle { name: String },
62    }
63
64    #[derive(Serialize)]
65    pub enum ChildAddress {
66        PathCounts        { name: String },
67        Edges             { name: String },
68        NeighborsMap      { name: String },
69        ParentsMap        { name: String },
70        SigmaMap          { name: String },
71        DeltaMap          { name: String },
72        VisitMarkers      { name: String },
73        PairDependencies  { name: String },
74        DistanceMap       { name: String },
75        NodeIdStack       { name: String },
76        NodeIdQueue       { name: String },
77    }
78}
79
80#[derive(Serialize)]
81pub struct BetweennessJsonBuilder {
82    parent_address: betweenness_json_builder::ParentAddress,
83    child_address:  betweenness_json_builder::ChildAddress,
84}
85
86impl BetweennessJsonBuilder {
87
88    pub fn new(
89        parent_address: betweenness_json_builder::ParentAddress, 
90        child_address:  betweenness_json_builder::ChildAddress) -> Self 
91    {
92        BetweennessJsonBuilder { 
93            parent_address,
94            child_address
95        }
96    }
97
98    pub fn to_json(&self) -> String {
99        serde_json::to_string(self).unwrap()
100    }
101}
102
103#[test] fn test_betweenness_json_builder() {
104
105    setup_test_logger![];
106
107    let parent  = betweenness_json_builder::ParentAddress::GraphHash { name: "gh".to_owned() };
108    let child   = betweenness_json_builder::ChildAddress::PathCounts { name: "pc".to_owned() };
109
110    let builder = BetweennessJsonBuilder::new(parent,child);
111
112    debug!("{}", builder.to_json());
113}