use std::fs;
use console::style;
use utils::{is_camel_or_pascal_case, starts_with_digit};
mod utils;
pub fn camel_to_snake(name: &str, is_constant: bool) -> String {
if name.is_empty() {
println!(
"{}",
style("Input string is empty. Please provide a valid variable name.").color256(208)
);
return String::new();
}
if !starts_with_digit(name) {
println!("{}", style("Input string is a digit.").color256(208));
return String::new();
}
if name.contains('_') {
return name.to_string();
}
if !is_camel_or_pascal_case(name) {
println!(
"{}",
style("is not in camelCase format. Please provide a valid camelCase variable name.")
.color256(208)
);
return String::new();
}
let mut result = String::new();
for (i, c) in name.chars().enumerate() {
if i > 0 && c.is_uppercase() {
result.push('_');
}
result.push(c.to_lowercase().next().unwrap());
}
if is_constant {
return result.to_uppercase();
}
result
}
pub fn batch_convert(ifile: &str, ofile: &str, is_constant: bool, silent: bool) {
let contents = fs::read_to_string(ifile).expect("Unable to read file.");
let converted_names: Vec<String> = contents
.lines()
.map(|line| camel_to_snake(line.trim(), is_constant))
.collect();
let output_content = converted_names.join("\n");
fs::write(ofile, output_content).expect("Unable to write file.");
if !silent {
println!("Batch conversion successful! Results written to {}", ofile);
}
}
pub fn snake_to_camel(name: &str, upper_case_camel: bool) -> String {
let mut camel_case = String::new();
let mut capitalize_next = true;
let mut to_lower_camel = !upper_case_camel;
if name.is_empty() {
return String::from("Input string is empty. Please provide a valid variable name.");
}
if !starts_with_digit(name) {
return String::from("Input string is a digit.");
}
for c in name.chars() {
if c == '_' {
capitalize_next = true;
} else {
if capitalize_next {
if to_lower_camel {
camel_case.push(c.to_ascii_lowercase());
to_lower_camel = false; } else {
camel_case.push(c.to_ascii_uppercase());
}
capitalize_next = false;
} else {
camel_case.push(c);
}
}
}
camel_case
}