restrepo 0.5.12

A collection of components for building restful webservices with actix-web
Documentation
use serde::{Serialize, Serializer};
use serde_json::{Map, Value};

/// Type to support ad-hoc casing of Json Values without interfering with general serde settings
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),
        }
    }
}