dynasty 1.4.1

Dynasty Reader's CLI downloader
Documentation
#[cfg(all(
    feature = "archiver",
    not(any(
        feature = "archive-pdf",
        feature = "archive-tar",
        feature = "archive-zip"
    ))
))]
compile_error!("archiver feature requires atleast 1 'archive-*' feature");

#[cfg(feature = "archiver")]
mod archiver;

#[cfg(feature = "search")]
mod search;

mod downloader;
mod parser;
mod resolver;
mod runner;
mod styles;

use std::path::PathBuf;

use anyhow::Result;
use clap::Parser;

use self::parser::ParsedArgumentValue;

#[derive(Debug, Parser)]
#[command(version, about)]
pub struct Cli {
    /// Urls to download
    #[arg(value_name = "URL")]
    #[cfg_attr(not(feature = "search"), arg(required = true))]
    targets: Vec<ParsedArgumentValue>,

    /// Archive downloaded chapters as `<ARCHIVE>`
    #[cfg(feature = "archiver")]
    #[arg(short, long, value_name = "ARCHIVE")]
    archive: Option<archiver::ArchiveKind>,

    /// Whether to keep archived chapters
    #[cfg(feature = "archiver")]
    #[arg(short = 'A', long, default_value_t = false)]
    keep_archived: bool,

    /// Sets the output directory
    #[arg(short, long, value_name = "PATH")]
    directory: Option<PathBuf>,

    /// Whether to flatten output directory
    #[arg(short, long, default_value_t = false)]
    flatten_directory: bool,

    /// Whether to not cache resolver results
    #[arg(short, long, default_value_t = false)]
    no_cache: bool,

    /// The maximum number of concurrently running requests
    #[arg(short = 'j', long, value_name = "COUNT", default_value_t = 4)]
    #[arg(value_parser = clap::value_parser!(u8).range(1..=8))]
    max_concurrent_request: u8,

    /// The maximum number of request retries
    #[arg(short = 'k', long, value_name = "COUNT", default_value_t = 4)]
    #[arg(value_parser = clap::value_parser!(u8).range(1..=32))]
    max_retry: u8,

    #[cfg(feature = "search")]
    #[command(subcommand)]
    commands: Commands,
}

#[cfg(feature = "search")]
#[derive(Debug, Clone, clap::Subcommand)]
pub enum Commands {
    /// Search for query on Dynasty Reader
    Search(search::SearchCommand),
}

#[tokio::main]
async fn main() -> Result<()> {
    let cli = Cli::parse();

    runner::execute(&cli).await?;

    Ok(())
}