DevCase/src/lib.rs

58 lines
1.7 KiB
Rust

use regex::Regex;
fn concert_replacement(original: &str, replacement: &str) -> String {
if cruet::is_camel_case(original) {
cruet::to_camel_case(replacement)
} else if cruet::is_kebab_case(original) {
cruet::to_kebab_case(replacement)
} else if cruet::is_pascal_case(original) {
cruet::to_pascal_case(replacement)
} else if cruet::is_snake_case(original) {
cruet::to_snake_case(replacement)
} else {
replacement.to_string()
}
}
pub fn replace(search: &String, replace: String, input: String) -> String {
let mut index = 0;
let mut output = input;
let search_pattern = Regex::new(&format!("(?i){search}")).unwrap();
while let Some(search_match) = search_pattern.find_at(&output, index) {
let start = search_match.start();
let end = search_match.end();
let mut replacement = String::new();
match search_pattern.captures(&output[start..end]) {
Some(captures) => {
captures.expand(&replace, &mut replacement);
}
None => {
replacement.push_str(&replace);
}
};
let converted_replacement = concert_replacement(&output[start..end], &replacement);
output.replace_range(start..end, &converted_replacement);
index = start + converted_replacement.len();
}
output
}
#[cfg(test)]
mod tests {
#[test]
fn runs_the_search_and_replace() {
assert_eq!(
String::from("foo foo"),
super::replace(
&String::from(r"\b\w+\b"),
String::from("foo"),
String::from("bar baz")
),
);
}
}