feat: basic parsing and read structure implemented
This commit is contained in:
85
src/parsers/mod.rs
Normal file
85
src/parsers/mod.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
use regex::Regex;
|
||||
|
||||
pub mod expressions;
|
||||
|
||||
pub fn apply_filename_template(template: &str, filename: &str) -> String {
|
||||
match template {
|
||||
"__name__" => filename.to_string(),
|
||||
"__upperCase_name__" => filename.to_uppercase().to_string(),
|
||||
"__lowerCase_name__" => filename.to_lowercase().to_string(),
|
||||
"__camelCase_name__" => parse_camel_case(filename),
|
||||
"__pascalCase_name__" => parse_pascal_case(filename),
|
||||
"__snakeCase_name__" => parse_snake_case(filename),
|
||||
"__upperSnakeCase_name__" => parse_snake_case(filename).to_uppercase(),
|
||||
"__kebabCase_name__" => parse_snake_case(filename).replace("_", "-"),
|
||||
"__lowerDotCase_name__" => parse_snake_case(filename).replace("_", "."),
|
||||
_ => filename.to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_camel_case(filename: &str) -> String {
|
||||
let first_char_regex = Regex::new(r"^[A-Z]").unwrap();
|
||||
let filename = parse_pascal_case(filename);
|
||||
let filename = first_char_regex
|
||||
.replace_all(&filename, |captured: ®ex::Captures| {
|
||||
captured[0].to_lowercase()
|
||||
})
|
||||
.into_owned();
|
||||
filename
|
||||
}
|
||||
|
||||
fn parse_pascal_case(filename: &str) -> String {
|
||||
let char_after_space_regex = Regex::new(r" ([a-z])").unwrap();
|
||||
let first_char_regex = Regex::new(r"^[a-z]").unwrap();
|
||||
|
||||
// Change all separators by " " to facilitate regex parsing
|
||||
let filename = filename.replace("-", " ").replace("_", " ");
|
||||
|
||||
let filename = char_after_space_regex
|
||||
.replace_all(&filename, |captured: ®ex::Captures| {
|
||||
format!(" {}", captured[1].to_uppercase())
|
||||
})
|
||||
.into_owned();
|
||||
let filename = first_char_regex
|
||||
.replace_all(&filename, |captured: ®ex::Captures| {
|
||||
captured[0].to_uppercase()
|
||||
})
|
||||
.into_owned();
|
||||
|
||||
let filename = filename.replace(" ", "");
|
||||
|
||||
filename
|
||||
}
|
||||
|
||||
fn parse_snake_case(filename: &str) -> String {
|
||||
let highlight_regex = Regex::new(r"[\s\_\-A-Z]([A-Za-z])").unwrap();
|
||||
|
||||
let splited_filename = filename.split_at(1);
|
||||
let rest_filename = splited_filename.1.to_string();
|
||||
let rest_filename = highlight_regex
|
||||
.replace_all(&rest_filename, |captured: ®ex::Captures| {
|
||||
let valid_char_regex = Regex::new(r"^[A-Za-z]$").unwrap();
|
||||
|
||||
let discarded = captured[0].to_string().chars().nth(0);
|
||||
let mut left_side = "".to_string();
|
||||
|
||||
if let Some(discarded_first) = discarded {
|
||||
if valid_char_regex.is_match(&discarded_first.to_string()) {
|
||||
left_side = discarded_first.to_string();
|
||||
}
|
||||
}
|
||||
format!(
|
||||
"_{}{}",
|
||||
left_side.to_lowercase(),
|
||||
captured[1].to_lowercase()
|
||||
)
|
||||
})
|
||||
.into_owned();
|
||||
let filename = format!(
|
||||
"{}{}",
|
||||
splited_filename.0.to_lowercase(),
|
||||
rest_filename.to_lowercase()
|
||||
);
|
||||
|
||||
filename.to_string()
|
||||
}
|
||||
Reference in New Issue
Block a user