diff --git a/.editorconfig b/.editorconfig index c54886b..c0bbc38 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,6 +5,7 @@ charset = utf-8 end_of_line = lf indent_size = 4 indent_style = space +insert_final_newline = true trim_trailing_whitespace = true [*.json] diff --git a/src/builder/cpp_file_builder.rs b/src/builder/cpp_file_builder.rs index ec73167..fbcfc87 100644 --- a/src/builder/cpp_file_builder.rs +++ b/src/builder/cpp_file_builder.rs @@ -4,7 +4,7 @@ use std::io::{Result, Write}; /// A structure representing a builder for C++ header files. /// The builder implements the `FileBuilder` trait. -#[derive(Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub struct CppFileBuilder; impl FileBuilder for CppFileBuilder { diff --git a/src/builder/csharp_file_builder.rs b/src/builder/csharp_file_builder.rs index cb66dc3..d4bbb6e 100644 --- a/src/builder/csharp_file_builder.rs +++ b/src/builder/csharp_file_builder.rs @@ -4,7 +4,7 @@ use std::io::{Result, Write}; /// A structure representing a builder for C# files. /// The builder implements the `FileBuilder` trait. -#[derive(Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub struct CSharpFileBuilder; impl FileBuilder for CSharpFileBuilder { diff --git a/src/builder/json_file_builder.rs b/src/builder/json_file_builder.rs index 9ca568e..1da339f 100644 --- a/src/builder/json_file_builder.rs +++ b/src/builder/json_file_builder.rs @@ -6,7 +6,7 @@ use std::collections::BTreeMap; use std::io::{Result, Write}; /// Represents a JSON offset value with an optional comment. -#[derive(Debug, PartialEq, Default, Serialize)] +#[derive(Clone, Debug, Default, PartialEq, Serialize)] struct JsonOffsetValue { value: usize, comment: Option, @@ -14,7 +14,7 @@ struct JsonOffsetValue { /// Represents a JSON module, which contains data in the form of a `BTreeMap` of string keys and /// `JsonOffsetValue` values, as well as an optional comment. -#[derive(Debug, PartialEq, Default, Serialize)] +#[derive(Clone, Debug, Default, PartialEq, Serialize)] struct JsonModule { data: BTreeMap, comment: Option, @@ -22,7 +22,7 @@ struct JsonModule { /// A structure representing a builder for JSON files. /// The builder implements the `FileBuilder` trait. -#[derive(Debug, PartialEq, Default)] +#[derive(Clone, Debug, Default, PartialEq)] pub struct JsonFileBuilder { data: BTreeMap, current_namespace: String, diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 4bc4358..e492c51 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -16,7 +16,7 @@ pub mod rust_file_builder; /// `FileBuilder` is an enum that defines different kinds of file builders. /// Each variant corresponds to a builder for a particular type of file. -#[derive(Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub enum FileBuilderEnum { /// Represents a builder for C++ header files. CppFileBuilder(CppFileBuilder), diff --git a/src/builder/python_file_builder.rs b/src/builder/python_file_builder.rs index 32e6b2a..9e85e90 100644 --- a/src/builder/python_file_builder.rs +++ b/src/builder/python_file_builder.rs @@ -4,7 +4,7 @@ use std::io::{Result, Write}; /// A structure representing a builder for Python files. /// The builder implements the `FileBuilder` trait. -#[derive(Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq)] pub struct PythonFileBuilder; impl FileBuilder for PythonFileBuilder { diff --git a/src/builder/rust_file_builder.rs b/src/builder/rust_file_builder.rs index 669539f..f6cf2a9 100644 --- a/src/builder/rust_file_builder.rs +++ b/src/builder/rust_file_builder.rs @@ -4,7 +4,7 @@ use std::io::{Result, Write}; /// A structure representing a builder for Rust files. /// The builder implements the `FileBuilder` trait. -#[derive(Debug, Default, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq)] pub struct RustFileBuilder; impl FileBuilder for RustFileBuilder { diff --git a/src/main.rs b/src/main.rs index c5a45b4..61792ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,17 +42,30 @@ struct Args { #[arg(short, long)] schemas: bool, - /// Enable verbose output. - #[arg(short, long)] - verbose: bool, + /// List of file builders to use. + /// Valid values are: `.cs`, `.hpp`, `.json`, `.py`, `.rs`. + #[arg( + short, + long, + value_parser = parse_extension, + value_delimiter = ',', + default_values = [".cs", ".hpp", ".json", ".py", ".rs"], + )] + builders: Vec, - /// Output folder. + /// Indentation level for generated files. + /// Defaults to 4 spaces. + #[arg(long, default_value_t = 4)] + indent: usize, + + /// Output directory for generated files. + /// Defaults to `generated`. #[arg(long, default_value = "generated")] output: String, - /// Indentation level. - #[arg(long, default_value = "4")] - indent: usize, + /// Enable verbose output. + #[arg(short, long)] + verbose: bool, } fn main() -> Result<()> { @@ -60,9 +73,10 @@ fn main() -> Result<()> { interfaces, offsets, schemas, - verbose, - output, + mut builders, indent, + output, + verbose, } = Args::parse(); let log_level = if verbose { @@ -83,14 +97,6 @@ fn main() -> Result<()> { process.initialize()?; - let mut builders: Vec = vec![ - FileBuilderEnum::CppFileBuilder(CppFileBuilder), - FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder), - FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default()), - FileBuilderEnum::PythonFileBuilder(PythonFileBuilder), - FileBuilderEnum::RustFileBuilder(RustFileBuilder), - ]; - let all = !(interfaces || offsets || schemas); if schemas || all { @@ -106,9 +112,30 @@ fn main() -> Result<()> { } info!( - "Done! Time elapsed: {:?}", + "Done! Time elapsed: {:?}", now.elapsed() ); Ok(()) } + +/// Parses the given file extension and returns the corresponding `FileBuilderEnum`. +/// +/// # Arguments +/// +/// * `extension` - A string slice that represents the file extension. +/// +/// # Returns +/// +/// * `Ok(FileBuilderEnum)` - If the extension is valid, returns the corresponding `FileBuilderEnum`. +/// * `Err(&'static str)` - If the extension is invalid, returns an error message. +fn parse_extension(extension: &str) -> Result { + match extension { + ".cs" => Ok(FileBuilderEnum::CSharpFileBuilder(CSharpFileBuilder)), + ".hpp" => Ok(FileBuilderEnum::CppFileBuilder(CppFileBuilder)), + ".json" => Ok(FileBuilderEnum::JsonFileBuilder(JsonFileBuilder::default())), + ".py" => Ok(FileBuilderEnum::PythonFileBuilder(PythonFileBuilder)), + ".rs" => Ok(FileBuilderEnum::RustFileBuilder(RustFileBuilder)), + _ => Err("Invalid extension"), + } +}