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
use convert_case::Case;
use crate::utils;


const RENAME_RULES: &[(&str, convert_case::Case)] = &[
   ("lowercase", Case::Lower),
   ("UPPERCASE", Case::Upper),
   ("PascalCase", Case::Pascal),
   ("camelCase", Case::Camel),
   ("snake_case", Case::Snake),
   ("SCREAMING_SNAKE_CASE", Case::ScreamingSnake),
   ("kebab-case", Case::Kebab),
   // ("SCREAMING-KEBAB-CASE", _), // not supported by convert_case
];


pub fn get_serde_casing(attributes: &Vec<syn::Attribute>) -> Option<Case> {
   let mut casing = utils::get_attribute_arg("serde", "renameAll", &attributes);
   if casing.is_none() {
      casing = utils::get_attribute_arg("serde", "rename_all", &attributes);
   }
   return to_case(casing);
}


fn to_case(val: impl Into<Option<String>>) -> Option<Case> {
   val.into().and_then(|x| {
      for (name, rule) in RENAME_RULES {
         if x == *name {
            return Some(*rule);
         }
      }
      None
   })
}