use crate::Casing;
use std::convert::TryFrom;
#[cfg(test)]
use strum_macros::EnumIter;
#[cfg_attr(test, derive(EnumIter))]
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub enum Case {
Upper,
Lower,
Title,
Toggle,
Camel,
Pascal,
UpperCamel,
Snake,
UpperSnake,
ScreamingSnake,
Kebab,
Cobol,
Train,
Flat,
UpperFlat,
Alternating,
}
impl Case {
pub fn name_in_case(self) -> String {
let case_str = format!("{:?}Case", self);
case_str.to_case(self)
}
pub fn all_cases() -> Vec<Case> {
use Case::*;
vec![
Upper,
Lower,
Title,
Toggle,
Camel,
Pascal,
UpperCamel,
Snake,
UpperSnake,
ScreamingSnake,
Kebab,
Cobol,
Train,
Flat,
UpperFlat,
Alternating,
]
}
}
impl TryFrom<&str> for Case {
type Error = ();
fn try_from(s: &str) -> Result<Self, Self::Error> {
let case_str = s.to_case(Case::Flat);
for case in Case::all_cases() {
if case_str == format!("{:?}", case).to_case(Case::Flat) {
return Ok(case);
}
}
Err(())
}
}
#[cfg(test)]
mod test {
use super::*;
use strum::IntoEnumIterator;
#[test]
fn all_cases_in_iter() {
let all = Case::all_cases();
for case in Case::iter() {
assert!(all.contains(&case));
}
}
}