use std::error;
use std::fmt;
pub const BOLD: &str = "\x1b[1m";
pub const RED: &str = "\x1b[31;1m";
pub const RESET: &str = "\x1b[0m";
pub const GREY: &str = "\x1b[90;3m";
#[derive(Debug, PartialEq)]
pub enum Errors {
ArgConversion(String),
InvalidArgument(String),
UnrecognisedCommand(String),
}
impl fmt::Display for Errors {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self {
Errors::ArgConversion(err) => {
write!(f, "Conversion: {}", err)
}
Errors::InvalidArgument(err) => {
write!(f, "Invalid Argument: {}", err)
}
Errors::UnrecognisedCommand(err) => {
write!(f, "Unrecognized command: {}", err)
}
}
}
}
impl error::Error for Errors {}
pub fn convert(curl: &[String]) -> Result<String, Errors> {
let curl_args = curl.join(" "); let mut args: Vec<String> = vec![];
let mut url: Vec<String> = vec!["<url>".to_string()];
for arg in curl_args.split(' ') {
if arg == "curl" {
continue; } else if arg.starts_with("http") {
url = vec![("'".to_owned() + arg + "'").to_string()];
} else if arg.starts_with('-') {
args.append(&mut vec![arg.to_string()]);
} else {
let len = args.len();
if len > 0 {
args[len - 1] += " ";
args[len - 1] += arg;
} else {
return Err(Errors::InvalidArgument(arg.to_string()));
}
}
}
args.append(&mut url); let mut wget_args: Vec<String> = Vec::with_capacity(args.len());
for (i, arg) in args.iter().enumerate() {
wget_args.insert(i, convert_arg(arg)?);
}
Ok("wget ".to_owned() + &wget_args.join(" "))
}
pub fn convert_arg(arg: &str) -> Result<String, Errors> {
if arg.starts_with("<url>") {
Ok(String::from("<url>"))
} else if arg.starts_with("'http") {
Ok(arg.to_owned())
} else {
match arg.split(' ').collect::<Vec<&str>>()[0] {
"-H" => Ok(arg.replace("-H ", "--header '").replace('\\', "\\\\") + "'"),
"--compressed" => Ok(arg.replace("--compressed", "--compression=auto")),
"--connect-timeout" => Ok(arg.replace("--connect-timeout ", "--timeout=")),
"--retry" => Ok(arg.replace("--retry ", "--tries=")),
_ => Err(Errors::ArgConversion(format!(
"{RED}No valid substitution for argument: {arg}!{RESET}",
))),
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_convert() {
let test_curl1 = "curl http://example.com".to_string();
assert_eq!(
convert(&[test_curl1]),
Ok("wget 'http://example.com'".into())
);
}
#[test]
fn test_convert_args() {
let test_args = vec![
"-H User-Agent: Example",
"--compressed",
"--connect-timeout 5",
"--retry 3",
];
let result_args = vec![
"--header 'User-Agent: Example'",
"--compression=auto",
"--timeout=5",
"--tries=3",
];
for (i, test_arg) in test_args.iter().enumerate() {
assert_eq!(convert_arg(test_arg), Ok(result_args[i].to_string()));
}
}
#[test]
fn test_convert_url() {
let test_str1 = "'http";
assert_eq!(convert_arg(test_str1), Ok("'http".into()));
}
}