diff --git a/Cargo.lock b/Cargo.lock index 2993084..fe13441 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,253 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "anstream" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" - -[[package]] -name = "anstyle-parse" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" -dependencies = [ - "anstyle", - "once_cell", - "windows-sys", -] - [[package]] name = "cat2text" version = "0.1.3" -dependencies = [ - "clap", - "clap_complete", -] - -[[package]] -name = "clap" -version = "4.5.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.5.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a7e468e750fa4b6be660e8b5651ad47372e8fb114030b594c2d75d48c5ffd0" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_derive" -version = "4.5.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" - -[[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "proc-macro2" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.96" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml index 535f2aa..cae4f88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,9 +21,4 @@ path = "src/lib.rs" name = "cat2text" path = "src/main.rs" -[features] -bin = ["dep:clap", "dep:clap_complete"] - [dependencies] -clap = { version = "4.5.26", features = ["derive", "cargo"], optional = true } -clap_complete = { version = "4.5.42", optional = true } diff --git a/README.md b/README.md index a0929de..1d4dd40 100644 --- a/README.md +++ b/README.md @@ -66,4 +66,4 @@ This currently only supports lowercase text in the latin alphabet, and byte arra - Improve CLI - Add error handling - Do `AsRef` stuff -- Optimize code +- Add u16/2-byte encoding in addition to just u8 for greater efficiency diff --git a/src/cli.rs b/src/cli.rs deleted file mode 100644 index 9bede55..0000000 --- a/src/cli.rs +++ /dev/null @@ -1,165 +0,0 @@ -// this is a separate feature for *optional* dependencies to ensure clap doesn't get compiled if you're just using the library -use cat2text::{self, anybase, core}; -use clap::{CommandFactory, Parser, Subcommand}; -use clap_complete::aot::{generate, Bash, Fish, PowerShell, Zsh}; -use std::{ - io::stdout, - time::Instant, -}; - -#[derive(Parser)] -#[command(version, about, long_about = None)] -pub(crate) struct Cli { - #[command(subcommand)] - pub command: Commands, -} - -#[derive(Subcommand, Debug)] -pub(crate) enum Commands { - ///Generate bash completions - GenerateBashCompletions, - ///Generate zsh completions - GenerateZshCompletions, - ///Generate fish completions - GenerateFishCompletions, - ///Generate PowerShell completions, - GeneratePowershellCompletions, - ///Encodes text/data to mrow~ - /// - ///The default is base 4 text encoding, to match the original program, but it can encode either text or binary data in up to base 16 meows :3 - Encode { - ///What base to encode using - up to base 16 - #[arg(short, long, default_value_t = 4)] - base: u8, - #[arg(long, default_value_t = false)] - ///Whether to use byte encoding or English text encoding; text encoding can only handle a-z (lowercase) - bytes: bool, - text: String, - }, - ///Decodes mrow~ to text/data - /// - ///The default is base 4 text encoding, to match the original program, but it can decode either text or binary data in up to base 16 meows :3 - Decode { - ///What base to decode using - up to base 16 - #[arg(short, long, default_value_t = 4)] - base: u8, - #[arg(long, default_value_t = false)] - ///Whether the input is using byte encoding or English text encoding - bytes: bool, - text: String, - }, - Benchmark { - ///What base to benchmark using - up to base 16 - #[arg(short, long, default_value_t = 4)] - base: u8, - ///Whether to use byte encoding or English text encoding; text encoding can only handle a-z (lowercase) - #[arg(long, default_value_t = false)] - bytes: bool, - ///How many iterations to run each benchmark for - #[arg(short, long, default_value_t = 1000)] - iterations: u128, - text: String, - }, -} - -pub(crate) fn run() { - let cli = Cli::parse(); - - match cli.command { - Commands::GenerateBashCompletions => { - generate( - Bash, - &mut Cli::command(), - clap::crate_name!(), - &mut stdout(), - ); - } - Commands::GenerateZshCompletions => { - generate(Zsh, &mut Cli::command(), clap::crate_name!(), &mut stdout()); - } - Commands::GenerateFishCompletions => { - generate( - Fish, - &mut Cli::command(), - clap::crate_name!(), - &mut stdout(), - ); - } - Commands::GeneratePowershellCompletions => { - generate( - PowerShell, - &mut Cli::command(), - clap::crate_name!(), - &mut stdout(), - ); - } - Commands::Encode { base, text, bytes } => { - println!("{}", encode(base, text, bytes)) - } - Commands::Decode { base, text, bytes } => { - println!("{}", decode(base, text, bytes)) - } - Commands::Benchmark { - base, - text, - bytes, - iterations, - } => { - let mut start = Instant::now(); - for _ in 0..iterations { - let _ = encode(base, text.clone(), bytes); - } - let encode_time = start.elapsed(); - println!("Encode time: {}", encode_time.as_millis()); - - start = Instant::now(); - for _ in 0..iterations { - let _ = decode(base, text.clone(), bytes); - } - let decode_time = start.elapsed(); - - println!("Decode time: {}", decode_time.as_millis()); - } - } -} - -fn encode(base: u8, text: String, bytes: bool) -> String { - match bytes { - true => { - return format!( - "{}", - anybase::bytes::encode( - text.as_bytes(), // make the string into a Vec - base as u32, - core::bytes::char_length(base as u32) - ) - ); - } - false => { - return format!( - "{}", - anybase::encode(text, base as u32, core::char_length(base as u32)) - ); - } - } -} - -fn decode(base: u8, text: String, bytes: bool) -> String { - match bytes { - true => { - return anybase::bytes::decode( - text, - base as u32, - core::bytes::char_length(base as u32), - ) - .into_iter() - .map(|item| item.to_string() + " ") - .collect::() - .trim() - .to_string(); - } - false => { - return anybase::decode(text, base as u32, core::char_length(base as u32)); - } - } -} diff --git a/src/main.rs b/src/main.rs index 23796ea..c883fbd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,32 @@ -#[cfg(feature = "bin")] -mod cli; +extern crate cat2text; +use cat2text::base4; +use std::io::{self, stdout, Write}; fn main() { - #[cfg(feature = "bin")] - cli::run() -} \ No newline at end of file + let stdin = io::stdin(); + let mut input; + + loop { + println!("Pick your translation:"); + println!("1) cat to text"); + println!("2) text to cat"); + input = "".to_string(); + stdin.read_line(&mut input).unwrap(); + print!("~> "); + stdout().flush().unwrap(); + let trimmed = input.trim(); + if trimmed == "1".to_string() { + input = "".to_string(); + stdin.read_line(&mut input).unwrap(); + println!("{}", base4::decode(input.trim().to_string())); + } else if trimmed == "2".to_string() { + input = "".to_string(); + stdin.read_line(&mut input).unwrap(); + println!("{}", base4::encode(input.trim().to_string())); + } else { + println!("Invalid input, exiting..."); + break; + } + println!(); + } +}