7 changed files with 138 additions and 0 deletions
@ -0,0 +1,11 @@ |
|||||||
|
[workspace] |
||||||
|
members = [ |
||||||
|
"app", |
||||||
|
"lib", |
||||||
|
] |
||||||
|
resolver = "3" |
||||||
|
|
||||||
|
[workspace.package] |
||||||
|
edition = "2024" |
||||||
|
authors = ["chodak166 <chodak166@op.pl>"] |
||||||
|
license = "MIT" |
||||||
@ -0,0 +1,12 @@ |
|||||||
|
[package] |
||||||
|
name = "mnemo-r" |
||||||
|
version = "0.1.0" |
||||||
|
edition = "2024" |
||||||
|
|
||||||
|
[dependencies] |
||||||
|
clap = { version = "4.5.51", features = ["derive"] } |
||||||
|
libmnemor = { path = "../lib" } |
||||||
|
|
||||||
|
[profile.release] |
||||||
|
lto = true # Link Time Optimization: Analyzes entire program for optimizations |
||||||
|
codegen-units = 1 # Forces single-threaded compilation (slower build, but smaller/faster binary) |
||||||
@ -0,0 +1,81 @@ |
|||||||
|
use clap::{Parser, ValueEnum}; |
||||||
|
|
||||||
|
#[derive(ValueEnum, Debug, Clone)] |
||||||
|
enum System { |
||||||
|
#[value(name = "major-en")] |
||||||
|
MajorEn, |
||||||
|
#[value(name = "major-pl")] |
||||||
|
MajorPl, |
||||||
|
} |
||||||
|
|
||||||
|
trait SystemEncoder { |
||||||
|
fn encode(&self, word: &str) -> String; |
||||||
|
} |
||||||
|
|
||||||
|
struct MajorEncoder { |
||||||
|
dict: String, // TODO
|
||||||
|
} |
||||||
|
|
||||||
|
impl SystemEncoder for MajorEncoder { |
||||||
|
fn encode(&self, word: &str) -> String { |
||||||
|
let num_word: String = word |
||||||
|
.chars() |
||||||
|
.map(|c| c.to_digit(10).unwrap_or(0).to_string()) |
||||||
|
.collect(); |
||||||
|
format!("{}_{} -> {}", word, self.dict, num_word) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fn create_encoder(system: &System) -> Box<dyn SystemEncoder> { |
||||||
|
match system { |
||||||
|
System::MajorPl => Box::new(MajorEncoder { |
||||||
|
dict: String::from("dict-major-pl"), |
||||||
|
}), |
||||||
|
System::MajorEn => Box::new(MajorEncoder { |
||||||
|
dict: String::from("dict-major-en"), |
||||||
|
}), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Parser)] |
||||||
|
#[command(author, version, about)] |
||||||
|
struct CliArgs { |
||||||
|
/// System name
|
||||||
|
#[arg(short, long, default_value = "major-pl")] |
||||||
|
system: System, |
||||||
|
|
||||||
|
/// Encode given word
|
||||||
|
#[arg(short, long)] |
||||||
|
encode: Option<String>, |
||||||
|
|
||||||
|
/// List supported systems
|
||||||
|
#[arg(long)] |
||||||
|
list_systems: bool, |
||||||
|
} |
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> { |
||||||
|
let args = CliArgs::parse(); |
||||||
|
|
||||||
|
if args.list_systems { |
||||||
|
println!("Supported systems:"); |
||||||
|
for system in System::value_variants() { |
||||||
|
if let Some(possible_value) = system.to_possible_value() { |
||||||
|
println!("- {}", possible_value.get_name()); |
||||||
|
} |
||||||
|
} |
||||||
|
return Ok(()); |
||||||
|
} |
||||||
|
|
||||||
|
if let Some(word) = args.encode { |
||||||
|
println!( |
||||||
|
"Encoding {} with system {:?}...", |
||||||
|
word, |
||||||
|
args.system.to_possible_value().unwrap().get_name() |
||||||
|
); |
||||||
|
let encoder = create_encoder(&args.system); |
||||||
|
let encoded_word = encoder.encode(&word); |
||||||
|
println!("Encoded: [{}]", encoded_word); |
||||||
|
} |
||||||
|
|
||||||
|
Ok(()) |
||||||
|
} |
||||||
@ -0,0 +1,6 @@ |
|||||||
|
[package] |
||||||
|
name = "libmnemor" |
||||||
|
version = "0.1.0" |
||||||
|
edition = "2024" |
||||||
|
|
||||||
|
[dependencies] |
||||||
@ -0,0 +1,28 @@ |
|||||||
|
pub struct TextProcessor { |
||||||
|
prefix: String, |
||||||
|
} |
||||||
|
|
||||||
|
impl TextProcessor { |
||||||
|
/// Create a new processor with custom prefix
|
||||||
|
pub fn new(prefix: &str) -> Self { |
||||||
|
Self { |
||||||
|
prefix: prefix.to_string(), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/// Process input text by adding prefix and converting to uppercase
|
||||||
|
pub fn process(&self, input: &str) -> String { |
||||||
|
format!("{} {}", self.prefix, input.to_uppercase()) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[cfg(test)] |
||||||
|
mod tests { |
||||||
|
use super::*; |
||||||
|
|
||||||
|
#[test] |
||||||
|
fn test_processing() { |
||||||
|
let processor = TextProcessor::new(">> "); |
||||||
|
assert_eq!(processor.process("hello"), ">> HELLO"); |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue