eureka-mmanager 0.3.3

An Actix actor collection for downloading manga, chapters, covers from Mangadex
Documentation
use std::fs::remove_dir_all;

use actix::prelude::*;
use uuid::Uuid;

use crate::{data_push::chapter::image::Mode, download::chapter::task::DownloadMode, DirsOptions};

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum ChapterImages {
    Data,
    DataSaver,
}

impl From<Mode> for ChapterImages {
    fn from(value: Mode) -> Self {
        match value {
            Mode::Data => Self::Data,
            Mode::DataSaver => Self::DataSaver,
        }
    }
}

impl From<DownloadMode> for ChapterImages {
    fn from(value: DownloadMode) -> Self {
        match value {
            DownloadMode::Normal => Self::Data,
            DownloadMode::DataSaver => Self::DataSaver,
        }
    }
}

#[derive(Debug, thiserror::Error)]
pub enum DeleteChapterImagesError {
    #[error("The normal images is not found")]
    DataNotFound,
    #[error("The data saver images is not found")]
    DataSaverNotFound,
    #[error("Cannot delete these images, delete the chapter instead")]
    Conflict,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct DeleteChapterImagesMessage {
    id: Uuid,
    images: ChapterImages,
    ignore_conflict: bool,
}

impl DeleteChapterImagesMessage {
    pub fn new<I: Into<ChapterImages>>(id: Uuid, images: I) -> Self {
        Self {
            id,
            images: images.into(),
            ignore_conflict: false,
        }
    }
    pub(crate) fn ignore_conflict(self, ignore: bool) -> Self {
        Self {
            ignore_conflict: ignore,
            ..self
        }
    }
}

impl Message for DeleteChapterImagesMessage {
    type Result = crate::ManagerCoreResult<()>;
}

impl Handler<DeleteChapterImagesMessage> for DirsOptions {
    type Result = <DeleteChapterImagesMessage as Message>::Result;
    fn handle(
        &mut self,
        msg: DeleteChapterImagesMessage,
        _ctx: &mut Self::Context,
    ) -> Self::Result {
        let data_path = self.chapters_id_data_add(msg.id);
        let data_saver_path = self.chapters_id_data_saver_add(msg.id);
        let remove = || match msg.images {
            ChapterImages::Data => {
                remove_dir_all(&data_path)?;
                Ok(())
            }
            ChapterImages::DataSaver => {
                remove_dir_all(&data_saver_path)?;
                Ok(())
            }
        };
        if (data_path.exists() && data_saver_path.exists()) || msg.ignore_conflict {
            remove()
        } else {
            Err(crate::Error::DeleteChapterImages(
                DeleteChapterImagesError::Conflict,
            ))
        }
    }
}