#![allow(dead_code)]
pub fn capitalize_first(s: &str) -> String {
s.chars()
.take(1)
.flat_map(|f| f.to_uppercase())
.chain(s.chars().skip(1))
.collect()
}
pub fn snakecase(name: impl ToString) -> String {
let text = name.to_string();
let mut buffer = String::with_capacity(text.len() + text.len() / 2);
let mut text = text.chars();
if let Some(first) = text.next() {
let mut n2: Option<(bool, char)> = None;
let mut n1: (bool, char) = (first.is_lowercase(), first);
for c in text {
let prev_n1 = n1;
let n3 = n2;
n2 = Some(n1);
n1 = (c.is_lowercase(), c);
if n1.0
&& matches!(n2, Some((false, _)))
&& matches!(n3, Some((false, _)))
&& n2.unwrap().1.is_uppercase()
&& n3.unwrap().1.is_uppercase()
{
buffer.push('_');
}
buffer.push_str(&prev_n1.1.to_lowercase().to_string());
if matches!(n2, Some((true, _))) && n1.1.is_uppercase() {
buffer.push('_');
}
}
buffer.push_str(&n1.1.to_lowercase().to_string());
}
buffer
}