dynasty 1.4.1

Dynasty Reader's CLI downloader
Documentation
mod methods;

use std::{fs, path::PathBuf};

use anyhow::Result;
use clap::ValueEnum;
use indicatif::ProgressBar;

#[derive(Debug, Clone, Copy)]
pub struct Archiver {
    pub kind: ArchiveKind,
    pub keep_archived: bool,
}

impl Archiver {
    pub fn archive(
        &self,
        chapter: &ArchivableChapter,
        progress_bar: &ProgressBar,
    ) -> Result<PathBuf> {
        let archive_function = match self.kind {
            #[cfg(feature = "archive-tar")]
            ArchiveKind::Cbt => methods::archive_cbt,
            #[cfg(feature = "archive-zip")]
            ArchiveKind::Cbz => methods::archive_cbz,
            #[cfg(feature = "archive-pdf")]
            ArchiveKind::Pdf => methods::archive_pdf,
            #[cfg(feature = "archive-tar")]
            ArchiveKind::Tar => methods::archive_tar,
            #[cfg(feature = "archive-zip")]
            ArchiveKind::Zip => methods::archive_zip,
        };

        let archive_path = archive_function(chapter, progress_bar)?;

        if !self.keep_archived {
            fs::remove_dir_all(&chapter.path)?;
        }

        Ok(archive_path)
    }
}

#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum ArchiveKind {
    #[cfg(feature = "archive-tar")]
    Cbt,
    #[cfg(feature = "archive-zip")]
    Cbz,
    #[cfg(feature = "archive-pdf")]
    Pdf,
    #[cfg(feature = "archive-tar")]
    Tar,
    #[cfg(feature = "archive-zip")]
    Zip,
}

#[derive(Debug, Clone)]
pub struct ArchivableChapter {
    pub path: PathBuf,
    pub pages: Vec<PathBuf>,
    pub title: String,
}

impl ArchivableChapter {
    fn filename(&self) -> &str {
        self.path
            .file_name()
            .and_then(|os_str| os_str.to_str())
            .unwrap()
    }

    fn path_with_extension(&self, extension: &str) -> PathBuf {
        self.path
            .with_file_name(format!("{}.{}", self.filename(), extension))
    }
}