diff --git a/Cargo.toml b/Cargo.toml index 85d6e26..a7fee3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,7 @@ authors = ["Smart SangGe "] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "2.26.0" \ No newline at end of file +clap = "2.33.2" +indicatif = "0.15" +console = "0.14" +reqwest = { version = "0.11", features = ["blocking"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8d3662e..bb49fd9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,18 @@ extern crate clap; +extern crate reqwest; +extern crate indicatif; +extern crate console; use clap::{Arg, App}; +use indicatif::{ProgressBar, ProgressStyle, HumanBytes}; +use console::style; +use std::io::Read; +use reqwest::header::{CONTENT_LENGTH, CONTENT_TYPE}; +use std::fs::File; +use std::io::{self, Write}; +use reqwest::blocking::Client; + + fn main() { let matches = App::new("Rget") @@ -13,8 +25,12 @@ fn main() { .index(1) .help("url to download")) .get_matches(); + let url = matches.value_of("URL").unwrap(); - println!("{}", url); + + if let Err(e) = download(url, false) { + eprintln!("Download error: {}", e); + } } fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option) -> ProgressBar { @@ -40,41 +56,56 @@ fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option) -> Prog bar } -fn download(target: &str, quiet_mode: bool) -> Result<(), Box<::std::error::Error>> { +fn download(target: &str, quiet_mode: bool) -> Result<(), Box> { // parse url - let url = parse_url(target)?; - let client = Client::new().unwrap(); - let mut resp = client.get(url)? - .send() - .unwrap(); - print(format!("HTTP request sent... {}", - style(format!("{}", resp.status())).green()), - quiet_mode); + let url = reqwest::Url::parse(target)?; + let client = reqwest::blocking::Client::new(); + let mut resp = client.get(url).send()?; + + + + if !quiet_mode { + println!("HTTP request sent... {}", style(resp.status()).green()); + } + if resp.status().is_success() { let headers = resp.headers().clone(); - let ct_len = headers.get::().map(|ct_len| **ct_len); + let ct_len = headers.get("content-length") + .and_then(|ct_len| ct_len.to_str().ok()) + .and_then(|ct_len_str| ct_len_str.parse::().ok()); + + let ct_type = headers.get("content-type") + .and_then(|ct_type| ct_type.to_str().ok()) + .unwrap(); // Be cautious with unwrap; it's better to handle None case - let ct_type = headers.get::().unwrap(); match ct_len { Some(len) => { - print(format!("Length: {} ({})", - style(len).green(), - style(format!("{}", HumanBytes(len))).red()), - quiet_mode); + if !quiet_mode { + println!("Length: {} ({})", + style(len).green(), + style(HumanBytes(len)).red()); + } }, None => { - print(format!("Length: {}", style("unknown").red()), quiet_mode); + if !quiet_mode { + println!("Length: {}", style("unknown").red()); + } }, } - print(format!("Type: {}", style(ct_type).green()), quiet_mode); + // Print content type + custom_print(format!("Type: {}", style(ct_type).green()), quiet_mode); + + // Get the filename from the URL let fname = target.split("/").last().unwrap(); - print(format!("Saving to: {}", style(fname).green()), quiet_mode); + // Print saving message + custom_print(format!("Saving to: {}", style(fname).green()), quiet_mode); + let chunk_size = match ct_len { Some(x) => x as usize / 99, @@ -107,4 +138,17 @@ fn download(target: &str, quiet_mode: bool) -> Result<(), Box<::std::error::Erro Ok(()) -} \ No newline at end of file +} + +fn save_to_file(data: &[u8], filename: &str) -> io::Result<()> { + let mut file = File::create(filename)?; + file.write_all(data)?; + Ok(()) +} + +fn custom_print(message: String, quiet_mode: bool) { + if !quiet_mode { + println!("{}", message); + } +} +