From 01417a7ac7d18e3ae6b09a92542ce1693512e25d Mon Sep 17 00:00:00 2001 From: Daniel Heras Quesada Date: Sun, 23 Feb 2025 01:29:38 +0100 Subject: [PATCH] release: V1 ready --- .../__camelCase_name__/__loweCase_name__.rs | 0 .../__snakeCase_name__/__kebabCase_name__ | 0 src/main.rs | 42 ++++++++++++++----- src/parsers/expressions.rs | 23 ---------- src/parsers/mod.rs | 35 +++++++++++----- src/parsers/test/parsers_tests.rs | 35 +++++++++++++++- 6 files changed, 90 insertions(+), 45 deletions(-) delete mode 100644 .blueprints/component/__camelCase_name__/__loweCase_name__.rs delete mode 100644 .blueprints/component/__camelCase_name__/__snakeCase_name__/__kebabCase_name__ delete mode 100644 src/parsers/expressions.rs diff --git a/.blueprints/component/__camelCase_name__/__loweCase_name__.rs b/.blueprints/component/__camelCase_name__/__loweCase_name__.rs deleted file mode 100644 index e69de29..0000000 diff --git a/.blueprints/component/__camelCase_name__/__snakeCase_name__/__kebabCase_name__ b/.blueprints/component/__camelCase_name__/__snakeCase_name__/__kebabCase_name__ deleted file mode 100644 index e69de29..0000000 diff --git a/src/main.rs b/src/main.rs index ffdfc56..ad43bd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,14 @@ mod files; mod parsers; -use std::fs; +use std::{ + fs::{self, File}, + io::Write, +}; use files::*; use inquire::{Select, Text}; -use parsers::apply_name_template; +use parsers::{apply_all_templates_to_string, apply_name_template}; use regex::Regex; #[cfg(test)] @@ -37,6 +40,7 @@ fn main() { } } +// TODO: clean up the mess, should encapsulate parsing and regex into specific functions to improve readability fn create_template( template_path: String, target_name: String, @@ -49,6 +53,7 @@ fn create_template( to_create_path.replace_range(0..template_path.len(), &target_path); + // TODO: migrate to new "apply all templates to string" strategy (change the function to allow for filename type of expressions) let get_path_names_regex = Regex::new(r"\/(__.*__)").unwrap(); to_create_path = get_path_names_regex .replace_all(&to_create_path, |captured: ®ex::Captures| { @@ -57,15 +62,32 @@ fn create_template( .into_owned(); if path.is_dir() { - // Create path - create_template( - path.display().to_string(), - target_name.clone(), - to_create_path, - ) - .unwrap(); + let dir_create_result = fs::create_dir(&to_create_path); + match dir_create_result { + Ok(_) => { + create_template( + path.display().to_string(), + target_name.clone(), + to_create_path, + ) + .unwrap(); + } + Err(_) => return Err(()), + } } else { - // Create file + let template_file_content = fs::read_to_string(path).unwrap(); + let target_file_content = + apply_all_templates_to_string(template_file_content, &target_name); + let file_result = File::create(to_create_path); + match file_result { + Ok(mut file) => { + let write_result = file.write_all(target_file_content.as_bytes()); + if let Err(_) = write_result { + return Err(()); + } + } + Err(_) => return Err(()), + } } } diff --git a/src/parsers/expressions.rs b/src/parsers/expressions.rs deleted file mode 100644 index 696079b..0000000 --- a/src/parsers/expressions.rs +++ /dev/null @@ -1,23 +0,0 @@ -pub const FILENAME_EXPRESSIONS: [&str; 9] = [ - "__name__", - "__upperCase_name__", - "__lowerCase_name__", - "__camelCase_name__", - "__pascalCase_name__", - "__snakeCase_name__", - "__upperSnakeCase_name__", - "__kebabCase_name__", - "__lowerDotCase_name__", -]; - -pub const TEMPLATE_EXPRESSIONS: [&str; 9] = [ - "{{name}}", - "{{upperCase name}}", - "{{lowerCase name}}", - "{{camelCase name}}", - "{{pascalCase name}}", - "{{snakeCase name}}", - "{{upperSnakeCase name}}", - "{{kebabCase name}}", - "{{lowerDotCase name}}", -]; diff --git a/src/parsers/mod.rs b/src/parsers/mod.rs index 4c8b9c1..b50cbe1 100644 --- a/src/parsers/mod.rs +++ b/src/parsers/mod.rs @@ -1,22 +1,35 @@ use regex::Regex; -pub mod expressions; - pub fn apply_name_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("_", "."), + "__name__" | "{{name}}" => filename.to_string(), + "__upperCase_name__" | "{{upperCase name}}" => filename.to_uppercase().to_string(), + "__lowerCase_name__" | "{{lowerCase name}}" => filename.to_lowercase().to_string(), + "__camelCase_name__" | "{{camelCase name}}" => parse_camel_case(filename), + "__pascalCase_name__" | "{{pascalCase name}}" => parse_pascal_case(filename), + "__snakeCase_name__" | "{{snakeCase name}}" => parse_snake_case(filename), + "__upperSnakeCase_name__" | "{{upperSnakeCase name}}" => { + parse_snake_case(filename).to_uppercase() + } + "__kebabCase_name__" | "{{kebabCase name}}" => parse_snake_case(filename).replace("_", "-"), + "__lowerDotCase_name__" | "{{lowerDotCase name}}" => { + parse_snake_case(filename).replace("_", ".") + } _ => filename.to_string(), } } +pub fn apply_all_templates_to_string(mut input: String, replacement: &str) -> String { + let get_template_names_regex = Regex::new(r"(\{\{(name|upperCase name|lowerCase name|camelCase name|pascalCase name|snakeCase name|upperSnakeCase name|kebabCase name|lowerDotCase name)\}\})").unwrap(); + input = get_template_names_regex + .replace_all(&input, |captured: ®ex::Captures| { + format!("{}", apply_name_template(&captured[1], replacement),) + }) + .into_owned(); + + input +} + fn parse_camel_case(filename: &str) -> String { let first_char_regex = Regex::new(r"^[A-Z]").unwrap(); let filename = parse_pascal_case(filename); diff --git a/src/parsers/test/parsers_tests.rs b/src/parsers/test/parsers_tests.rs index 1e0b8a1..32385bf 100644 --- a/src/parsers/test/parsers_tests.rs +++ b/src/parsers/test/parsers_tests.rs @@ -1,6 +1,30 @@ #[cfg(test)] pub mod tests { - use crate::parsers::{apply_name_template, expressions::FILENAME_EXPRESSIONS}; + use crate::parsers::{apply_all_templates_to_string, apply_name_template}; + + pub const FILENAME_EXPRESSIONS: [&str; 9] = [ + "__name__", + "__upperCase_name__", + "__lowerCase_name__", + "__camelCase_name__", + "__pascalCase_name__", + "__snakeCase_name__", + "__upperSnakeCase_name__", + "__kebabCase_name__", + "__lowerDotCase_name__", + ]; + + pub const _TEMPLATE_EXPRESSIONS: [&str; 9] = [ + "{{name}}", + "{{upperCase name}}", + "{{lowerCase name}}", + "{{camelCase name}}", + "{{pascalCase name}}", + "{{snakeCase name}}", + "{{upperSnakeCase name}}", + "{{kebabCase name}}", + "{{lowerDotCase name}}", + ]; #[test] fn test_apply_filename_template() { @@ -23,4 +47,13 @@ pub mod tests { assert_eq!(output, expected_filename_output[i]) } } + + #[test] + fn test_apply_all_templates_to_string() { + const NAME: &str = "this_is a-TeSt"; + const INPUT: &str = "{{name}} {{upperCase name}}{{lowerCase name}} {{camelCase name}}{{pascalCase name}} {{snakeCase name}}{{upperSnakeCase name}} {{kebabCase name}}{{lowerDotCase name}}"; + const EXPECTED_OUTPUT: &str = "this_is a-TeSt THIS_IS A-TESTthis_is a-test thisIsATeStThisIsATeSt this_is_a_te_stTHIS_IS_A_TE_ST this-is-a-te-stthis.is.a.te.st"; + let output = apply_all_templates_to_string(INPUT.to_string(), NAME); + assert_eq!(output, EXPECTED_OUTPUT); + } }