extern crate serde;
extern crate serde_json;
extern crate serde_tagged;
#[macro_use]
extern crate serde_derive;
use serde::Serialize;
use serde_json::Value;
#[derive(Serialize)]
struct Test {
foo: &'static str,
baz: i32,
}
fn serialize_to_string_external<T, V>(tag: &T, value: &V) -> String
where
T: Serialize + ?Sized,
V: Serialize + ?Sized,
{
let mut buf = Vec::with_capacity(128);
{
let mut serializer = serde_json::Serializer::new(&mut buf);
serde_tagged::ser::external::serialize(&mut serializer, tag, value).unwrap();
}
String::from_utf8(buf).unwrap()
}
fn assert_json_equal(a: &str, b: &str) {
let a: Value = serde_json::from_str(a).unwrap();
let b: Value = serde_json::from_str(b).unwrap();
assert_eq!(a, b);
}
fn main() {
let value_1 = Test {
foo: "bar",
baz: 42,
};
let ser = serialize_to_string_external("Type", &value_1);
assert_json_equal(
&ser,
r###"
{
"Type": {
"foo": "bar",
"baz": 42
}
}
"###,
);
let ser = serialize_to_string_external("Int", &42_i32);
assert_json_equal(
&ser,
r###"
{
"Int": 42
}
"###,
);
}