use serde_json::{Map, Value};
pub fn obj<I>(pairs: I) -> Value
where
I: IntoIterator<Item = (&'static str, Value)>,
{
Value::Object(
pairs
.into_iter()
.map(|(k, v)| (k.to_owned(), v))
.collect::<Map<String, Value>>(),
)
}
#[cfg(test)]
mod tests {
use super::obj;
use serde_json::Value;
#[test]
fn obj_builds_the_same_shape_as_the_json_macro() {
let built = obj([
("name", Value::from("x")),
("count", Value::from(3usize)),
("ok", Value::from(true)),
]);
let parsed: Value = serde_json::from_str(r#"{"name":"x","count":3,"ok":true}"#)
.expect("literal is valid JSON");
assert_eq!(built, parsed);
}
#[test]
fn obj_nests() {
let built = obj([("outer", obj([("inner", Value::from(1u64))]))]);
assert_eq!(built["outer"]["inner"], Value::from(1u64));
}
#[test]
fn obj_with_no_pairs_is_an_empty_object() {
let built = obj([]);
assert_eq!(built, Value::Object(serde_json::Map::new()));
}
}