use alloc::string::{String, ToString};
use alloc::vec::Vec;
fn lowercase_word(word: &str) -> String {
word.to_lowercase()
}
fn uppercase_word(word: &str) -> String {
word.to_uppercase()
}
fn capital_word(word: &str) -> String {
let mut chars = word.chars();
if let Some(c) = chars.next() {
[c.to_uppercase().collect(), chars.as_str().to_lowercase()].concat()
} else {
String::new()
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum Pattern {
Noop,
Lowercase,
Uppercase,
Capital,
Camel,
Sentence,
Custom(fn(&[&str]) -> Vec<String>),
}
impl Pattern {
pub fn mutate(&self, words: &[&str]) -> Vec<String> {
use Pattern::*;
match self {
Custom(transformation) => (transformation)(words),
Noop => words.iter().map(|word| word.to_string()).collect(),
Lowercase => words.iter().map(|word| lowercase_word(word)).collect(),
Uppercase => words.iter().map(|word| uppercase_word(word)).collect(),
Capital => words.iter().map(|word| capital_word(word)).collect(),
Camel => words
.iter()
.enumerate()
.map(|(i, &word)| {
if i == 0 {
lowercase_word(word)
} else {
capital_word(word)
}
})
.collect(),
Sentence => words
.iter()
.enumerate()
.map(|(i, &word)| {
if i == 0 {
capital_word(word)
} else {
lowercase_word(word)
}
})
.collect(),
}
}
}
#[cfg(test)]
mod test {
use crate::Case;
use crate::Converter;
use super::*;
#[test]
fn mutate_empty_strings() {
for word_pattern in [lowercase_word, uppercase_word, capital_word] {
assert_eq!(String::new(), word_pattern(&String::new()))
}
}
#[test]
fn filtering_with_custom() {
let filter_camel_pattern = Pattern::Custom(|words| {
Pattern::Camel.mutate(
&words
.into_iter()
.filter(|word| word.len() > 0)
.map(|word| *word)
.collect::<Vec<&str>>(),
)
});
let conv = Converter::new()
.from_case(Case::Kebab)
.set_pattern(filter_camel_pattern);
assert_eq!(conv.convert("--leading-delims"), "leadingDelims");
}
}