celery_rs_core/argparse/
kwargs.rs

1/*
2Kwargs for the program
3
4Author Andrew Evans
5*/
6
7use std::collections::{BTreeMap, HashMap};
8use std::vec::Vec;
9
10use amiquip::AmqpValue;
11use amq_protocol::types::AMQPType;
12use serde_json::{Map, Value};
13
14use crate::argparse::args::Arg;
15
16
17/// Keyword argument
18#[derive(Clone, Debug)]
19pub struct KwArg{
20    pub key: String,
21    pub arg: Arg,
22}
23
24
25/// Structure storing the arguments
26#[derive(Clone, Debug)]
27pub struct KwArgs{
28    pub kwargs: Vec<KwArg>,
29}
30
31
32/// Argument implementation
33impl KwArg{
34
35    /// Create a new argument
36    fn new(key: String, arg: Value, arg_type: AMQPType) -> KwArg{
37        let arg_object = Arg{
38            arg: arg,
39            arg_type: arg_type,
40        };
41
42        KwArg{
43            key: key,
44            arg: arg_object,
45        }
46    }
47}
48
49
50/// Implementation of arguments list
51impl KwArgs{
52
53    /// Convert to a btree map
54    pub fn convert_to_btree_map(&self) -> BTreeMap<String, AmqpValue>{
55        let vkwarr = self.kwargs.clone();
56        let mut vm = BTreeMap::<String, AmqpValue>::new();
57        for i in 0..vkwarr.len(){
58            let kwarg = vkwarr.get(i).unwrap().clone();
59            vm.insert(kwarg.key, AmqpValue::from(kwarg.arg.arg));
60        }
61        vm
62    }
63
64    /// Covnert kwargs to map
65    pub fn convert_to_map(&self) -> Map<String, Value>{
66        let vkwarr = self.kwargs.clone();
67        let mut vm = Map::new();
68        for i in 0..vkwarr.len(){
69            let kwarg = vkwarr.get(i).unwrap().clone();
70            let val = kwarg.arg.arg;
71            let key = kwarg.key;
72            vm.insert(key, val);
73        }
74        vm
75    }
76
77    /// size of the list
78    pub fn size(&self) -> usize{
79        self.kwargs.len()
80    }
81
82    /// add an argument
83    pub fn add_kwarg(&mut self, kwarg: KwArg){
84        self.kwargs.push(kwarg);
85    }
86
87    /// create a new arguments list
88    pub fn new() -> KwArgs{
89        KwArgs{
90            kwargs: Vec::<KwArg>::new(),
91        }
92    }
93
94}
95
96
97#[cfg(test)]
98mod tests{
99    use amq_protocol::types::AMQPType;
100    use serde_json::Value;
101
102    use super::*;
103
104    #[test]
105    fn should_create_an_kwarg_argument(){
106        let kstr = String::from("test_key");
107        let kvalstr = String::from("test_val");
108        let kval = Value::from(kvalstr);
109        let arg = Arg{
110            arg: kval.clone().to_owned(),
111            arg_type: AMQPType::LongString,
112        };
113
114        let kwarg = KwArg{
115            key: kstr.to_owned(),
116            arg: arg.to_owned(),
117        };
118        let k = kwarg.key;
119        let v = kwarg.arg.arg;
120        assert!(k.eq("test_key"));
121        assert!(v.as_str().unwrap().eq("test_val"));
122    }
123
124    #[test]
125    fn should_create_a_kwargs_list(){
126        let kstr = String::from("test_key");
127        let kvalstr = String::from("test_val");
128        let kval = Value::from(kvalstr);
129        let arg = Arg{
130            arg: kval.clone().to_owned(),
131            arg_type: AMQPType::LongString,
132        };
133
134        let kwarg = KwArg{
135            key: kstr.to_owned(),
136            arg: arg.to_owned(),
137        };
138        let kstrb = String::from("test_keyb");
139        let kvstrb = String::from("test_val");
140        let vstrb = Value::from(kvstrb);
141        let argb = Arg{
142            arg: vstrb.clone().to_owned(),
143            arg_type: AMQPType::LongString,
144        };
145        let kwargb = KwArg{
146            key: kstrb.to_owned(),
147            arg: argb.clone(),
148        };
149        let mut kwargs = KwArgs::new();
150        kwargs.add_kwarg(kwarg.clone());
151        kwargs.add_kwarg(kwargb.clone());
152        assert!(kwargs.size() == 2);
153        assert!(kwargs.kwargs.len() == 2);
154    }
155}