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))
}
}