Skip to content

Commit 12304fa

Browse files
committed
Make the params! macro emit the Params type
Instead of Vec<(String, Value)> (see blackbeam/rust-mysql-simple#249)
1 parent 704c906 commit 12304fa

File tree

1 file changed

+54
-45
lines changed

1 file changed

+54
-45
lines changed

src/lib.rs

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -80,48 +80,54 @@ pub use uuid;
8080
#[macro_export]
8181
macro_rules! params {
8282
() => {};
83-
(@to_pair $name:expr => $value:expr) => (
84-
(std::string::String::from($name), $crate::value::Value::from($value))
83+
(@to_pair $map:expr, $name:expr => $value:expr) => (
84+
$map.insert(
85+
std::string::String::from($name),
86+
$crate::value::Value::from($value),
87+
)
8588
);
86-
(@to_pair $name:ident) => (
87-
(std::string::String::from(stringify!($name)), $crate::value::Value::from($name))
89+
(@to_pair $map:expr, $name:ident) => (
90+
$map.insert(
91+
std::string::String::from(stringify!($name)),
92+
$crate::value::Value::from($name),
93+
)
8894
);
89-
(@expand $vec:expr;) => {};
90-
(@expand $vec:expr; $name:expr => $value:expr, $($tail:tt)*) => {
91-
$vec.push(params!(@to_pair $name => $value));
92-
params!(@expand $vec; $($tail)*);
95+
(@expand $map:expr;) => {};
96+
(@expand $map:expr; $name:expr => $value:expr, $($tail:tt)*) => {
97+
params!(@to_pair $map, $name => $value);
98+
params!(@expand $map; $($tail)*);
9399
};
94-
(@expand $vec:expr; $name:expr => $value:expr $(, $tail:tt)*) => {
95-
$vec.push(params!(@to_pair $name => $value));
96-
params!(@expand $vec; $($tail)*);
100+
(@expand $map:expr; $name:expr => $value:expr $(, $tail:tt)*) => {
101+
params!(@to_pair $map, $name => $value);
102+
params!(@expand $map; $($tail)*);
97103
};
98-
(@expand $vec:expr; $name:ident, $($tail:tt)*) => {
99-
$vec.push(params!(@to_pair $name));
100-
params!(@expand $vec; $($tail)*);
104+
(@expand $map:expr; $name:ident, $($tail:tt)*) => {
105+
params!(@to_pair $map, $name);
106+
params!(@expand $map; $($tail)*);
101107
};
102-
(@expand $vec:expr; $name:ident $(, $tail:tt)*) => {
103-
$vec.push(params!(@to_pair $name));
104-
params!(@expand $vec; $($tail)*);
108+
(@expand $map:expr; $name:ident $(, $tail:tt)*) => {
109+
params!(@to_pair $map, $name);
110+
params!(@expand $map; $($tail)*);
105111
};
106112
($i:ident, $($tail:tt)*) => {
107113
{
108-
let mut output = std::vec::Vec::new();
109-
params!(@expand output; $i, $($tail)*);
110-
output
114+
let mut map: std::collections::HashMap<std::string::String, $crate::value::Value, _> = std::default::Default::default();
115+
params!(@expand (&mut map); $i, $($tail)*);
116+
$crate::params::Params::Named(map)
111117
}
112118
};
113119
($i:expr => $($tail:tt)*) => {
114120
{
115-
let mut output = std::vec::Vec::new();
116-
params!(@expand output; $i => $($tail)*);
117-
output
121+
let mut map: std::collections::HashMap<std::string::String, $crate::value::Value, _> = std::default::Default::default();
122+
params!(@expand (&mut map); $i => $($tail)*);
123+
$crate::params::Params::Named(map)
118124
}
119125
};
120126
($i:ident) => {
121127
{
122-
let mut output = std::vec::Vec::new();
123-
params!(@expand output; $i);
124-
output
128+
let mut map: std::collections::HashMap<std::string::String, $crate::value::Value, _> = std::default::Default::default();
129+
params!(@expand (&mut map); $i);
130+
$crate::params::Params::Named(map)
125131
}
126132
}
127133
}
@@ -170,70 +176,73 @@ pub mod value;
170176
#[cfg(test)]
171177
#[test]
172178
fn params_macro_test() {
173-
use crate::value::Value;
179+
use crate::{params::Params, value::Value};
174180

175181
let foo = 42;
176182
let bar = "bar";
177183

178-
assert_eq!(vec![(String::from("foo"), Value::Int(42))], params! { foo });
179184
assert_eq!(
180-
vec![(String::from("foo"), Value::Int(42))],
185+
Params::from(vec![(String::from("foo"), Value::Int(42))]),
186+
params! { foo }
187+
);
188+
assert_eq!(
189+
Params::from(vec![(String::from("foo"), Value::Int(42))]),
181190
params! { foo, }
182191
);
183192
assert_eq!(
184-
vec![
193+
Params::from(vec![
185194
(String::from("foo"), Value::Int(42)),
186195
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
187-
],
196+
]),
188197
params! { foo, bar }
189198
);
190199
assert_eq!(
191-
vec![
200+
Params::from(vec![
192201
(String::from("foo"), Value::Int(42)),
193202
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
194-
],
203+
]),
195204
params! { foo, bar, }
196205
);
197206
assert_eq!(
198-
vec![
207+
Params::from(vec![
199208
(String::from("foo"), Value::Int(42)),
200209
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
201-
],
210+
]),
202211
params! { "foo" => foo, "bar" => bar }
203212
);
204213
assert_eq!(
205-
vec![
214+
Params::from(vec![
206215
(String::from("foo"), Value::Int(42)),
207216
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
208-
],
217+
]),
209218
params! { "foo" => foo, "bar" => bar, }
210219
);
211220
assert_eq!(
212-
vec![
221+
Params::from(vec![
213222
(String::from("foo"), Value::Int(42)),
214223
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
215-
],
224+
]),
216225
params! { foo, "bar" => bar }
217226
);
218227
assert_eq!(
219-
vec![
228+
Params::from(vec![
220229
(String::from("foo"), Value::Int(42)),
221230
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
222-
],
231+
]),
223232
params! { "foo" => foo, bar }
224233
);
225234
assert_eq!(
226-
vec![
235+
Params::from(vec![
227236
(String::from("foo"), Value::Int(42)),
228237
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
229-
],
238+
]),
230239
params! { foo, "bar" => bar, }
231240
);
232241
assert_eq!(
233-
vec![
242+
Params::from(vec![
234243
(String::from("foo"), Value::Int(42)),
235244
(String::from("bar"), Value::Bytes((&b"bar"[..]).into())),
236-
],
245+
]),
237246
params! { "foo" => foo, bar, }
238247
);
239248
}

0 commit comments

Comments
 (0)