1use derive_more::Display;
2
3mod constant;
4mod snake;
5mod title;
6
7pub use snake::to_snake_case;
8
9#[derive(Clone, Copy, Debug, Display)]
18pub enum Case {
19 Camel,
20 Constant, Kebab,
22 Lower,
23 Sentence,
24 Snake,
25 Title,
26 Upper,
27 UpperCamel, UpperSnake, UpperKebab, }
31
32pub trait Casing<T: std::fmt::Display> {
37 fn to_case(&self, case: Case) -> String;
38 fn is_case(&self, case: Case) -> bool;
39}
40
41impl<T: std::fmt::Display> Casing<T> for T
42where
43 String: PartialEq<T>,
44{
45 fn to_case(&self, case: Case) -> String {
49 use convert_case as cc;
50 let s = &self.to_string();
51
52 match case {
53 Case::Lower => s.to_lowercase(),
55 Case::Upper => s.to_uppercase(),
56
57 Case::Title => title::to_title_case(s),
59 Case::Snake => snake::to_snake_case(s),
60 Case::UpperSnake => snake::to_snake_case(s).to_uppercase(),
61 Case::Constant => constant::to_constant_case(s).to_uppercase(),
62
63 Case::Camel => cc::Casing::to_case(s, cc::Case::Camel),
65 Case::Kebab => cc::Casing::to_case(s, cc::Case::Kebab),
66 Case::Sentence => cc::Casing::to_case(s, cc::Case::Sentence),
67 Case::UpperCamel => cc::Casing::to_case(s, cc::Case::UpperCamel),
68 Case::UpperKebab => cc::Casing::to_case(s, cc::Case::Kebab).to_uppercase(),
69 }
70 }
71
72 fn is_case(&self, case: Case) -> bool {
74 &self.to_case(case) == self
75 }
76}