use serde::{Serialize, Serializer};
use serde_json::{Map, Value};
pub struct JsonCaser;
impl JsonCaser {
pub fn camel_case<D: Serialize, S: Serializer>(
data: &D,
serializer: S,
) -> Result<S::Ok, S::Error> {
let val = serde_json::to_value(data).map_err(serde::ser::Error::custom)?;
match val {
Value::Object(map) => {
let cased = map
.into_iter()
.map(|(k, v)| (stringcase::camel_case(&k), v))
.collect::<Map<_, _>>();
cased.serialize(serializer)
}
Value::String(s) => {
let cased = stringcase::camel_case(&s);
cased.serialize(serializer)
}
Value::Array(v) => Self::camel_case(&v, serializer),
_ => val.serialize(serializer),
}
}
}