celery_rs_core/argparse/
kwargs.rs1use 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#[derive(Clone, Debug)]
19pub struct KwArg{
20 pub key: String,
21 pub arg: Arg,
22}
23
24
25#[derive(Clone, Debug)]
27pub struct KwArgs{
28 pub kwargs: Vec<KwArg>,
29}
30
31
32impl KwArg{
34
35 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
50impl KwArgs{
52
53 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 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 pub fn size(&self) -> usize{
79 self.kwargs.len()
80 }
81
82 pub fn add_kwarg(&mut self, kwarg: KwArg){
84 self.kwargs.push(kwarg);
85 }
86
87 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}