eureka_manager_cli/commands/
count.rs1pub 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 Manga(Box<manga::CountMangaArgs>),
22 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}