1mod qs;
34
35pub use crate::qs::QueryString;
36pub use crate::qs::UrlEncoding;
37
38#[macro_export]
39macro_rules! stringify {
40
41 ($(($k:expr, $v:expr)),+) => {{
42 let mut q_vec: Vec<String> = Vec::new();
43 $(
44 q_vec.push($v.to_qs($k));
45 )*
46 q_vec.join("&")
47 }};
48 ($m:expr) => {{
49 let mut q_vec: Vec<String> = Vec::new();
50 for (k, v) in $m.into_iter() {
51 q_vec.push(v.to_qs(k));
52 }
53 q_vec.join("&")
54 }};
55 ($($k:literal => $v:expr);+) => {{
56 let mut q_vec: Vec<String> = Vec::new();
57 $(
58 q_vec.push($v.to_qs($k));
59 )*
60 q_vec.join("&")
61 }};
62}
63
64
65#[cfg(test)]
66mod tests {
67 use std::collections::BTreeMap;
68 use crate::qs::QueryString;
69
70 #[test]
71 fn test_stringify_common() {
72 let x = 1;
73 let y: Option<i32> = None;
74 let s = stringify!{
75 "a" => x;
76 "b" => 2usize;
77 "c" => 3f64;
78 "d" => x + 6;
79 "e" => vec![4i32, 5i32, 6i32];
80 "f" => "hello world";
81 "g" => Some(8);
82 "h" => y
83 };
84 println!("{}", s);
85 assert_eq!(s, "a=1&b=2&c=3&d=7&e[]=4&e[]=5&e[]=6&f=hello%20world&g=8&h=");
86 }
87
88 #[test]
89 fn test_stringify_map() {
90 let mut m = BTreeMap::new();
91 m.insert("a", 1);
92 m.insert("b", 2);
93 m.insert("c", 3);
94 let s = stringify!(m);
95 assert_eq!(s, "a=1&b=2&c=3");
96
97 let mut m = BTreeMap::new();
98 m.insert("a", "hello world");
99 m.insert("b", "ksd");
100 m.insert("c", "turbidsoul");
101 let s = stringify!(m);
102 assert_eq!(s, "a=hello%20world&b=ksd&c=turbidsoul");
103 }
104
105 #[test]
106 fn test_stringify_tuple() {
107 let x = 1;
108 let s = stringify![
109 ("a", x),
110 ("b", 2i32),
111 ("c", 3i32),
112 ("d", x + 6),
113 ("e", vec![4i32, 5i32, 6i32]),
114 ("f", "hello world")
115 ];
116 assert_eq!(s, "a=1&b=2&c=3&d=7&e[]=4&e[]=5&e[]=6&f=hello%20world");
117 }
118}