From 2e48ea90e18aff1f3f5bfa879faee5620d21e299 Mon Sep 17 00:00:00 2001 From: robatipoor Date: Thu, 10 Oct 2019 08:58:12 +0330 Subject: [PATCH] move argument parser section to args mod --- src/args.rs | 62 +++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 76 +++++++++++++++-------------------------------------- 2 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 src/args.rs diff --git a/src/args.rs b/src/args.rs new file mode 100644 index 0000000..34fe5d0 --- /dev/null +++ b/src/args.rs @@ -0,0 +1,62 @@ +use clap::{App, Arg}; + +#[derive(Default)] +pub struct AppArgs { + pub url_target: String, + pub no_css: bool, + pub no_frames: bool, + pub no_images: bool, + pub no_js: bool, + pub insecure: bool, + pub isolate: bool, + pub silent: bool, + pub user_agent: String, +} + +const DEFAULT_USER_AGENT: &str = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0"; + +impl AppArgs { + pub fn get() -> AppArgs { + let app = App::new("monolith") + .version(crate_version!()) + .author(crate_authors!("\n")) + .about(crate_description!()) + .arg( + Arg::with_name("url") + .required(true) + .takes_value(true) + .index(1) + .help("URL to download"), + ) + // .args_from_usage("-a, --include-audio 'Embed audio sources'") + .args_from_usage("-c, --no-css 'Ignore styles'") + .args_from_usage("-f, --no-frames 'Exclude iframes'") + .args_from_usage("-i, --no-images 'Remove images'") + .args_from_usage("-I, --isolate 'Cut off from the Internet'") + .args_from_usage("-j, --no-js 'Exclude JavaScript'") + .args_from_usage("-k, --insecure 'Accept invalid X.509 (TLS) certificates'") + .args_from_usage("-s, --silent 'Suppress verbosity'") + .args_from_usage("-u, --user-agent=[Iceweasel] 'Custom User-Agent string'") + // .args_from_usage("-v, --include-video 'Embed video sources'") + .get_matches(); + let mut app_args = AppArgs::default(); + // Process the command + app_args.url_target = app + .value_of("url") + .expect("please set target url") + .to_string(); + app_args.no_css = app.is_present("no-css"); + app_args.no_frames = app.is_present("no-frames"); + app_args.no_images = app.is_present("no-images"); + app_args.no_js = app.is_present("no-js"); + app_args.insecure = app.is_present("insecure"); + app_args.isolate = app.is_present("isolate"); + app_args.silent = app.is_present("silent"); + app_args.user_agent = app + .value_of("user-agent") + .unwrap_or_else(|| DEFAULT_USER_AGENT) + .to_string(); + app_args + } +} diff --git a/src/main.rs b/src/main.rs index 42a74a7..e6b72ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,57 +2,23 @@ extern crate clap; extern crate monolith; -use clap::{App, Arg}; +mod args; + +use args::AppArgs; use monolith::html::{html_to_dom, stringify_document, walk_and_embed_assets}; use monolith::http::retrieve_asset; use monolith::utils::is_valid_url; -const DEFAULT_USER_AGENT: &str = - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0"; - fn main() { - let command = App::new("monolith") - .version(crate_version!()) - .author(crate_authors!("\n")) - .about(crate_description!()) - .arg( - Arg::with_name("url") - .required(true) - .takes_value(true) - .index(1) - .help("URL to download"), - ) - // .args_from_usage("-a, --include-audio 'Embed audio sources'") - .args_from_usage("-c, --no-css 'Ignore styles'") - .args_from_usage("-f, --no-frames 'Exclude iframes'") - .args_from_usage("-i, --no-images 'Remove images'") - .args_from_usage("-I, --isolate 'Cut off from the Internet'") - .args_from_usage("-j, --no-js 'Exclude JavaScript'") - .args_from_usage("-k, --insecure 'Accept invalid X.509 (TLS) certificates'") - .args_from_usage("-s, --silent 'Suppress verbosity'") - .args_from_usage("-u, --user-agent=[Iceweasel] 'Custom User-Agent string'") - // .args_from_usage("-v, --include-video 'Embed video sources'") - .get_matches(); - - // Process the command - let arg_target: &str = command.value_of("url").unwrap(); - let opt_no_css: bool = command.is_present("no-css"); - let opt_no_frames: bool = command.is_present("no-frames"); - let opt_no_images: bool = command.is_present("no-images"); - let opt_no_js: bool = command.is_present("no-js"); - let opt_insecure: bool = command.is_present("insecure"); - let opt_isolate: bool = command.is_present("isolate"); - let opt_silent: bool = command.is_present("silent"); - let opt_user_agent: &str = command.value_of("user-agent").unwrap_or(DEFAULT_USER_AGENT); - - if is_valid_url(arg_target) { + let app_args = AppArgs::get(); + if is_valid_url(app_args.url_target.as_str()) { let (data, final_url) = retrieve_asset( - &arg_target, + app_args.url_target.as_str(), false, "", - opt_user_agent, - opt_silent, - opt_insecure, + app_args.user_agent.as_str(), + app_args.silent, + app_args.insecure, ) .unwrap(); let dom = html_to_dom(&data); @@ -60,22 +26,22 @@ fn main() { walk_and_embed_assets( &final_url, &dom.document, - opt_no_css, - opt_no_js, - opt_no_images, - opt_user_agent, - opt_silent, - opt_insecure, - opt_no_frames, + app_args.no_css, + app_args.no_js, + app_args.no_images, + app_args.user_agent.as_str(), + app_args.silent, + app_args.insecure, + app_args.no_frames, ); let html: String = stringify_document( &dom.document, - opt_no_css, - opt_no_frames, - opt_no_js, - opt_no_images, - opt_isolate, + app_args.no_css, + app_args.no_frames, + app_args.no_js, + app_args.no_images, + app_args.isolate, ); println!("{}", html);