use serde_json::{Map, Value};
use std::collections::HashMap;
pub fn to_camel_case(s: &str) -> String {
let mut out = String::with_capacity(s.len());
let mut capitalize_next = false;
for c in s.chars() {
if c == '_' {
capitalize_next = true;
} else if capitalize_next {
out.extend(c.to_uppercase());
capitalize_next = false;
} else {
out.push(c);
}
}
out
}
pub fn to_snake_case(s: &str) -> String {
let mut out = String::with_capacity(s.len() + 4);
for (i, c) in s.chars().enumerate() {
if c.is_uppercase() {
if i > 0 {
out.push('_');
}
out.extend(c.to_lowercase());
} else {
out.push(c);
}
}
out
}
pub fn object_keys_to_camel_case(obj: &mut Map<String, Value>) {
let keys: Vec<String> = obj.keys().cloned().collect();
for k in keys {
let camel = to_camel_case(&k);
if camel != k {
if let Some(v) = obj.remove(&k) {
obj.insert(camel, v);
}
}
}
}
pub fn object_keys_to_snake_case(obj: &mut Map<String, Value>) {
let keys: Vec<String> = obj.keys().cloned().collect();
for k in keys {
let snake = to_snake_case(&k);
if snake != k {
if let Some(v) = obj.remove(&k) {
obj.insert(snake, v);
}
}
}
}
pub fn value_keys_to_camel_case(value: &mut Value) {
if let Value::Object(ref mut map) = value {
object_keys_to_camel_case(map);
}
}
pub fn value_keys_to_camel_case_recursive(value: &mut Value) {
match value {
Value::Object(map) => {
object_keys_to_camel_case(map);
for (_, v) in map.iter_mut() {
value_keys_to_camel_case_recursive(v);
}
}
Value::Array(arr) => {
for v in arr.iter_mut() {
value_keys_to_camel_case_recursive(v);
}
}
_ => {}
}
}
pub fn value_keys_to_snake_case(value: &mut Value) {
if let Value::Object(ref mut map) = value {
object_keys_to_snake_case(map);
}
}
pub fn hashmap_keys_to_snake_case(map: &HashMap<String, Value>) -> HashMap<String, Value> {
map.iter()
.map(|(k, v)| (to_snake_case(k), v.clone()))
.collect()
}