1mod constant;
7mod snake;
8mod title;
9
10use std::fmt::{self, Display};
11
12use convert_case as cc;
13
14pub use snake::to_snake_case;
15
16#[derive(Clone, Copy, Debug)]
24pub enum Case {
25 Camel,
26 Constant,
27 Kebab,
28 Lower,
29 Sentence,
30 Snake,
31 Title,
32 Upper,
33 UpperCamel,
34 UpperSnake,
35 UpperKebab,
36}
37
38impl Display for Case {
39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40 let label = match self {
41 Self::Camel => "Camel",
42 Self::Constant => "Constant",
43 Self::Kebab => "Kebab",
44 Self::Lower => "Lower",
45 Self::Sentence => "Sentence",
46 Self::Snake => "Snake",
47 Self::Title => "Title",
48 Self::Upper => "Upper",
49 Self::UpperCamel => "UpperCamel",
50 Self::UpperSnake => "UpperSnake",
51 Self::UpperKebab => "UpperKebab",
52 };
53
54 f.write_str(label)
55 }
56}
57
58pub trait Casing<T: std::fmt::Display> {
66 fn to_case(&self, case: Case) -> String;
68
69 fn is_case(&self, case: Case) -> bool;
71}
72
73impl<T: std::fmt::Display> Casing<T> for T
74where
75 String: PartialEq<T>,
76{
77 fn to_case(&self, case: Case) -> String {
78 let s = &self.to_string();
79
80 match case {
81 Case::Lower => s.to_lowercase(),
82 Case::Upper => s.to_uppercase(),
83 Case::Title => title::to_title_case(s),
84 Case::Snake => snake::to_snake_case(s),
85 Case::UpperSnake => snake::to_snake_case(s).to_uppercase(),
86 Case::Constant => constant::to_constant_case(s),
87 Case::Camel => cc::Casing::to_case(s, cc::Case::Camel),
88 Case::Kebab => cc::Casing::to_case(s, cc::Case::Kebab),
89 Case::Sentence => cc::Casing::to_case(s, cc::Case::Sentence),
90 Case::UpperCamel => cc::Casing::to_case(s, cc::Case::UpperCamel),
91 Case::UpperKebab => cc::Casing::to_case(s, cc::Case::Kebab).to_uppercase(),
92 }
93 }
94
95 fn is_case(&self, case: Case) -> bool {
96 &self.to_case(case) == self
97 }
98}