1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use inflector::cases::snakecase::to_snake_case;
use serde_json::{map::Map, Value};
use std::collections::HashMap;
pub fn general_canonical_string(
operation_name: String,
mut json_value: Value,
without_fields: Vec<String>,
) -> String {
let json_map = json_value.as_object_mut().unwrap();
let payload_map = json_map["payload"].as_object_mut().unwrap();
recursively_snake_case(payload_map, without_fields);
let payload_string = serde_json::to_string(&payload_map).unwrap();
let out = format!("{},{}", operation_name, payload_string);
out
}
fn recursively_snake_case(map: &mut Map<String, Value>, without: Vec<String>) {
let mut remove_key_map = HashMap::new();
for key in without {
remove_key_map.insert(key, true);
}
let key_list: Vec<String> = map.keys().cloned().collect();
for key in key_list {
let mut value = map.remove(&key).unwrap();
if remove_key_map.get(&to_snake_case(&key)) == None {
if value.is_object() {
let mut_next_map = value.as_object_mut().unwrap();
recursively_snake_case(mut_next_map, vec![]);
} else if value.is_string() {
value = value.as_str().unwrap().to_ascii_lowercase().into();
} else if value.is_null() {
continue;
}
map.insert(to_snake_case(&key), value);
}
}
}