create Cli deriving a clap::Parser
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline failed

This commit is contained in:
Paul Campbell 2024-03-27 07:37:42 +00:00
parent 60912880d3
commit 8450708ec6

View file

@ -9,6 +9,106 @@ type Error = crate::errors::CliError<AppConfigBuilderError>;
const DEFAULT_MAX_CONN: usize = 8; const DEFAULT_MAX_CONN: usize = 8;
#[derive(Debug, clap::Parser)]
pub struct Cli {
#[clap(short, long, help = "Urls of web articles")]
urls: Vec<String>,
#[clap(short, long, help = "Input file containing links")]
file: Option<String>,
#[clap(
short,
long,
help = "Directory to store output epub documents",
conflicts_with = "output-name"
)]
output_directory: Option<String>,
#[clap(
short,
long,
help = "Merge multiple articles into a single epub",
long_help = "Merge multiple articles into a single epub that will be given the name provided",
conflicts_with = "output-directory"
)]
output_name: Option<String>,
#[clap(
short,
long,
default_value = "8",
help = "The maximum number of concurrent HTTP connections when downloading articles. Default is 8",
long_help = "The maximum number of concurrent HTTP connections when downloading articles. Default is 8.\nNOTE: It is advised to use as few connections as needed i.e between 1 and 50. Using more connections can end up overloading your network card with too many concurrent requests."
)]
max_conn: usize,
#[clap(short, long, parse(from_occurrences),
help = "Enables logging of events and set the verbosity level. Use --help to read on its usage",
long_help = "This takes upto 4 levels of verbosity in the following order.
\n- Error (-v)
\n- Warn (-vv)
\n- Info (-vvv)
\n- Debug (-vvvv)
\nWhen this flag is passed, it disables the progress bars and logs to stderr.
\nIf you would like to send the logs to a file (and enable progress bars), pass the log-to-file flag."
)]
verbosity: u8,
#[clap(
short,
long,
help = "Enables logging of events to a file located in .paperoni/logs with a default log level of debug. Use -v to specify the logging level"
)]
log_to_file: bool,
#[clap(
short,
long,
requires = "output-name",
help = "Add an inlined Table of Contents page at the start of the merged article."
)]
inline_toc: bool,
#[clap(
short,
long,
conflicts_with = "no-header-css",
help = "Removes the stylesheets used in the EPUB generation. Pass --help to learn more",
long_help = "Removes the stylesheets used in the EPUB generation.
\nThe EPUB file will then be laid out based on your e-reader's default stylesheets.
\nImages and code blocks may overflow when this flag is set and layout of generated
\nPDFs will be affected. Use --no-header-css if you want to only disable the styling on headers."
)]
no_css: bool,
#[clap(
short,
long,
conflicts_with = "no-css",
help = "Removes the header CSS styling but preserves styling of images and codeblocks. To remove all the default CSS, use --no-css instead."
)]
no_header_css: bool,
#[clap(
short, long,
default_value = "epub",
possible_values = &["epub", "html"],
value_name = "type",
help = "Specify the file type of the export. The type must be in lower case.",
)]
export: String,
#[clap(short, long,
help = "Inlines the article images when exporting to HTML using base64. Pass --help to learn more.",
long_help = "Inlines the article images when exporting to HTML using base64.
\nThis is used when you do not want a separate folder created for images during HTML export.
\nNOTE: It uses base64 encoding on the images which results in larger HTML export sizes as each image
\nincreases in size by about 25%-33%."
)]
inline_images: bool,
}
#[derive(derive_builder::Builder, Debug)] #[derive(derive_builder::Builder, Debug)]
pub struct AppConfig { pub struct AppConfig {
/// Article urls /// Article urls
@ -221,10 +321,10 @@ mod test {
// It returns an error when no args are passed // It returns an error when no args are passed
let result = app.clone().get_matches_from_safe(vec!["paperoni"]); let result = app.clone().get_matches_from_safe(vec!["paperoni"]);
assert!(result.is_err()); assert!(result.is_err());
assert_eq!( // assert_eq!(
clap::ErrorKind::MissingArgumentOrSubcommand, // clap::ErrorKind::MissingArgumentOrSubcommand,
result.unwrap_err().kind // result.unwrap_err().kind
); // );
// It returns an error when both output-dir and merge are used // It returns an error when both output-dir and merge are used
let result = app.clone().get_matches_from_safe(vec![ let result = app.clone().get_matches_from_safe(vec![