eureka_manager_cli/commands/
count.rs

1pub mod chapter;
2pub mod cover;
3pub mod manga;
4
5use clap::{Args, Subcommand, ValueEnum};
6use eureka_mmanager::{
7    files_dirs::messages::pull::{
8        chapter::ChapterListDataPullMessage, cover::CoverListDataPullMessage,
9        manga::MangaListDataPullMessage,
10    },
11    prelude::GetManagerStateData,
12};
13use mangadex_api_types_rust::{MangaDexDateTime, TagSearchMode};
14use serde::{de::IntoDeserializer, Deserialize};
15
16use super::{AsyncRun, AsyncRunContext};
17
18#[derive(Debug, Subcommand)]
19pub enum CountSubcommand {
20    /// Count manga with filters
21    Manga(Box<manga::CountMangaArgs>),
22    /// Count covers with filters,
23    Cover(cover::CountCoverArgs),
24    Chapter(Box<chapter::CountChapterArgs>),
25}
26
27impl AsyncRun for CountSubcommand {
28    async fn run(&self, ctx: AsyncRunContext) -> anyhow::Result<()> {
29        match self {
30            CountSubcommand::Manga(count_manga_args) => count_manga_args.run(ctx).await,
31            CountSubcommand::Cover(count_cover_args) => count_cover_args.run(ctx).await,
32            CountSubcommand::Chapter(count_chapter_args) => count_chapter_args.run(ctx).await,
33        }
34    }
35}
36
37#[derive(Debug, Args)]
38pub struct CountArgs {
39    #[command(subcommand)]
40    pub subcommand: Option<CountSubcommand>,
41}
42
43impl AsyncRun for CountArgs {
44    async fn run(&self, ctx: AsyncRunContext) -> anyhow::Result<()> {
45        if let Some(subcommand) = self.subcommand.as_ref() {
46            subcommand.run(ctx).await
47        } else {
48            let dirs_options = ctx.manager.get_dir_options().await?;
49            println!(
50                "Number of titles available: {}",
51                dirs_options
52                    .send(MangaListDataPullMessage)
53                    .await??
54                    .flatten()
55                    .count()
56            );
57            println!(
58                "Number of covers available: {}",
59                dirs_options
60                    .send(CoverListDataPullMessage)
61                    .await??
62                    .flatten()
63                    .count()
64            );
65            println!(
66                "Number of chapters available: {}",
67                dirs_options
68                    .send(ChapterListDataPullMessage)
69                    .await??
70                    .flatten()
71                    .count()
72            );
73            Ok(())
74        }
75    }
76}
77
78#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, ValueEnum)]
79pub enum TagSearchModeEnum {
80    And,
81    Or,
82}
83
84impl From<TagSearchModeEnum> for TagSearchMode {
85    fn from(value: TagSearchModeEnum) -> Self {
86        match value {
87            TagSearchModeEnum::And => Self::And,
88            TagSearchModeEnum::Or => Self::Or,
89        }
90    }
91}
92
93pub fn mangadex_time_from_str(s: &str) -> Result<MangaDexDateTime, String> {
94    MangaDexDateTime::deserialize(s.into_deserializer())
95        .map_err(|e: serde::de::value::Error| format!("{e}"))
96}