Merge 27d0c9cb9f
into ce1eb55d7e
commit
7c39d2d8a5
@ -0,0 +1 @@
|
||||
target
|
@ -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"
|
@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "quickreplace"
|
||||
version = "0.1.0"
|
||||
authors = ["You <you@example.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
text-colorizer = "1"
|
||||
regex = "1"
|
@ -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 <target> <replacement> <INPUT> <OUTPUT>");
|
||||
}
|
||||
|
||||
fn parse_args() -> Arguments {
|
||||
let args: Vec<String> = 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<String, regex::Error>
|
||||
{
|
||||
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);
|
||||
}
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue