qs_rs/
lib.rs

1//!
2//! ```
3//! let x = 1;
4//! let y: Option<i32> = None;
5//! let s = stringify!{
6//!     "a" => x;
7//!     "b" => 2usize;
8//!     "c" => 3f64;
9//!     "d" => x + 6;
10//!     "e" => vec![4i32, 5i32, 6i32];
11//!     "f" => "hello world";
12//!     "g" => Some(8);
13//!     "h" => y
14//! };
15//! assert_eq!(s, "a=1&b=2&c=3&d=7&e[]=4&e[]=5&e[]=6&f=hello%20world");
16//!
17//! use std::collections::BTreeMap;
18//! let mut m = BTreeMap::new();
19//! m.insert("a", 1);
20//! m.insert("b", 2);
21//! m.insert("c", 3);
22//! let s = stringify!(m);
23//! assert_eq!(s,  "a=1&b=2&c=3");
24//!
25//! let s = stringify![
26//!     ("a", 1),
27//!     ("b", 2),
28//!     ("c", 3)
29//! ];
30//! assert_eq!(s,  "a=1&b=2&c=3");
31//! ```
32
33mod 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}