@@ -7,6 +7,10 @@ authors = ["Smart SangGe <liangjunyong06@gmail.com>"]
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
<<<<<<< HEAD
|
||||||
clap = "2.33.2"
|
clap = "2.33.2"
|
||||||
indicatif = "0.15"
|
indicatif = "0.15"
|
||||||
console = "0.14"
|
console = "0.14"
|
||||||
|
=======
|
||||||
|
clap = "2.26.0"
|
||||||
|
>>>>>>> parent of 4ca1b62 (feat: finish all func)
|
||||||
|
|||||||
75
src/main.rs
75
src/main.rs
@@ -1,4 +1,5 @@
|
|||||||
extern crate clap;
|
extern crate clap;
|
||||||
|
<<<<<<< HEAD
|
||||||
extern crate indicatif;
|
extern crate indicatif;
|
||||||
extern crate console;
|
extern crate console;
|
||||||
|
|
||||||
@@ -9,6 +10,10 @@ use std::fs::File;
|
|||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
|
||||||
|
|
||||||
|
=======
|
||||||
|
|
||||||
|
use clap::{Arg, App};
|
||||||
|
>>>>>>> parent of 4ca1b62 (feat: finish all func)
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let matches = App::new("Rget")
|
let matches = App::new("Rget")
|
||||||
@@ -21,12 +26,8 @@ fn main() {
|
|||||||
.index(1)
|
.index(1)
|
||||||
.help("url to download"))
|
.help("url to download"))
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let url = matches.value_of("URL").unwrap();
|
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<u64>) -> ProgressBar {
|
fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option<u64>) -> ProgressBar {
|
||||||
@@ -52,56 +53,41 @@ fn create_progress_bar(quiet_mode: bool, msg: &str, length: Option<u64>) -> Prog
|
|||||||
bar
|
bar
|
||||||
}
|
}
|
||||||
|
|
||||||
fn download(target: &str, quiet_mode: bool) -> Result<(), Box<dyn (::std::error::Error)>> {
|
fn download(target: &str, quiet_mode: bool) -> Result<(), Box<::std::error::Error>> {
|
||||||
|
|
||||||
// parse url
|
// parse url
|
||||||
let url = reqwest::Url::parse(target)?;
|
let url = parse_url(target)?;
|
||||||
let client = reqwest::blocking::Client::new();
|
let client = Client::new().unwrap();
|
||||||
let mut resp = client.get(url).send()?;
|
let mut resp = client.get(url)?
|
||||||
|
.send()
|
||||||
|
.unwrap();
|
||||||
|
print(format!("HTTP request sent... {}",
|
||||||
if !quiet_mode {
|
style(format!("{}", resp.status())).green()),
|
||||||
println!("HTTP request sent... {}", style(resp.status()).green());
|
quiet_mode);
|
||||||
}
|
|
||||||
|
|
||||||
if resp.status().is_success() {
|
if resp.status().is_success() {
|
||||||
|
|
||||||
let headers = resp.headers().clone();
|
let headers = resp.headers().clone();
|
||||||
let ct_len = headers.get("content-length")
|
let ct_len = headers.get::<ContentLength>().map(|ct_len| **ct_len);
|
||||||
.and_then(|ct_len| ct_len.to_str().ok())
|
|
||||||
.and_then(|ct_len_str| ct_len_str.parse::<u64>().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::<ContentType>().unwrap();
|
||||||
|
|
||||||
match ct_len {
|
match ct_len {
|
||||||
Some(len) => {
|
Some(len) => {
|
||||||
if !quiet_mode {
|
print(format!("Length: {} ({})",
|
||||||
println!("Length: {} ({})",
|
style(len).green(),
|
||||||
style(len).green(),
|
style(format!("{}", HumanBytes(len))).red()),
|
||||||
style(HumanBytes(len)).red());
|
quiet_mode);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
if !quiet_mode {
|
print(format!("Length: {}", style("unknown").red()), 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();
|
let fname = target.split("/").last().unwrap();
|
||||||
|
|
||||||
// Print saving message
|
print(format!("Saving to: {}", style(fname).green()), quiet_mode);
|
||||||
custom_print(format!("Saving to: {}", style(fname).green()), quiet_mode);
|
|
||||||
|
|
||||||
|
|
||||||
let chunk_size = match ct_len {
|
let chunk_size = match ct_len {
|
||||||
Some(x) => x as usize / 99,
|
Some(x) => x as usize / 99,
|
||||||
@@ -135,16 +121,3 @@ fn download(target: &str, quiet_mode: bool) -> Result<(), Box<dyn (::std::error:
|
|||||||
Ok(())
|
Ok(())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user