diff --git a/quickreplace/.gitignore b/quickreplace/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/quickreplace/.gitignore @@ -0,0 +1 @@ +target diff --git a/quickreplace/Cargo.lock b/quickreplace/Cargo.lock new file mode 100644 index 0000000..8ddc532 --- /dev/null +++ b/quickreplace/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "quickreplace" +version = "0.1.0" \ No newline at end of file diff --git a/quickreplace/Cargo.toml b/quickreplace/Cargo.toml new file mode 100644 index 0000000..5381945 --- /dev/null +++ b/quickreplace/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "quickreplace" +version = "0.1.0" +authors = ["You "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +text-colorizer = "1" +regex = "1" diff --git a/quickreplace/src/main.rs b/quickreplace/src/main.rs new file mode 100644 index 0000000..25ed913 --- /dev/null +++ b/quickreplace/src/main.rs @@ -0,0 +1,67 @@ +use text_colorizer::*; +use std::env; +use std::fs; +use regex::Regex; + +#[derive(Debug)] +struct Arguments { + target: String, + replacement: String, + filename: String, + output: String, +} + +fn print_usage() { + eprintln!("{} - change occurrences of one string into another", "quickreplace".green()); + eprintln!("Usage: quickreplace "); +} + +fn parse_args() -> Arguments { + let args: Vec = env::args().skip(1).collect(); + if args.len() != 4 { + print_usage(); + eprintln!("{} wrong number of arguments: expected 4, got {}.", "Error:".red().bold(), + args.len()); + std::process::exit(1); + } + Arguments { + target: args[0].clone(), + replacement: args[1].clone(), + filename: args[2].clone(), + output: args[3].clone() + } +} + +fn replace(target: &str, replacement: &str, text: &str) -> Result +{ + let regex = Regex::new(target)?; + Ok(regex.replace_all(text, replacement).to_string()) +} + + +fn main() { + let args = parse_args(); + let data = match fs::read_to_string(&args.filename) { + Ok(v) => v, + Err(e) => { + eprintln!("{} failed to read from file '{}': {:?}", + "Error:".red().bold(), args.filename, e); + std::process::exit(1); + } + }; + let replaced_data = match replace(&args.target, &args.replacement, &data) { + Ok(v) => v, + Err(e) => { + eprintln!("{} failed to replace text: {:?}", "Error:".red().bold(), e); + std::process::exit(1); + } + }; + match fs::write(&args.output, &replaced_data) { + Ok(v) => v, + Err(e) => { + eprintln!("{} failed to write to file '{}': {:?}", + "Error:".red().bold(), args.filename, e); + std::process::exit(1); + } + }; +} \ No newline at end of file