lib_mal/model/
fields.rs

1use bitflags::bitflags;
2use std::fmt::Display;
3
4bitflags! {
5    pub struct AnimeFields: u32 {
6        const ID                        = 0b0000_0000_0000_0000_0000_0000_0000_0001;
7        const Title                     = 0b0000_0000_0000_0000_0000_0000_0000_0010;
8        const MainPicture               = 0b0000_0000_0000_0000_0000_0000_0000_0100;
9        const AlternativeTitles         = 0b0000_0000_0000_0000_0000_0000_0000_1000;
10        const StartDate                 = 0b0000_0000_0000_0000_0000_0000_0001_0000;
11        const EndDate                   = 0b0000_0000_0000_0000_0000_0000_0010_0000;
12        const Synopsis                  = 0b0000_0000_0000_0000_0000_0000_0100_0000;
13        const Mean                      = 0b0000_0000_0000_0000_0000_0000_1000_0000;
14        const Rank                      = 0b0000_0000_0000_0000_0000_0001_0000_0000;
15        const Popularity                = 0b0000_0000_0000_0000_0000_0010_0000_0000;
16        const NumListUsers              = 0b0000_0000_0000_0000_0000_0100_0000_0000;
17        const NumScoringUsers           = 0b0000_0000_0000_0000_0000_1000_0000_0000;
18        const NSFW                      = 0b0000_0000_0000_0000_0001_0000_0000_0000;
19        const CreatedAt                 = 0b0000_0000_0000_0000_0010_0000_0000_0000;
20        const UpdatedAt                 = 0b0000_0000_0000_0000_0100_0000_0000_0000;
21        const MediaType                 = 0b0000_0000_0000_0000_1000_0000_0000_0000;
22        const Status                    = 0b0000_0000_0000_0001_0000_0000_0000_0000;
23        const Genres                    = 0b0000_0000_0000_0010_0000_0000_0000_0000;
24        const MyListStatus              = 0b0000_0000_0000_0100_0000_0000_0000_0000;
25        const NumEpisodes               = 0b0000_0000_0000_1000_0000_0000_0000_0000;
26        const StartSeason               = 0b0000_0000_0001_0000_0000_0000_0000_0000;
27        const Broadcast                 = 0b0000_0000_0010_0000_0000_0000_0000_0000;
28        const Source                    = 0b0000_0000_0100_0000_0000_0000_0000_0000;
29        const AverageEpisodeDuration    = 0b0000_0000_1000_0000_0000_0000_0000_0000;
30        const Rating                    = 0b0000_0001_0000_0000_0000_0000_0000_0000;
31        const Pictures                  = 0b0000_0010_0000_0000_0000_0000_0000_0000;
32        const Background                = 0b0000_0100_0000_0000_0000_0000_0000_0000;
33        const RelatedAnime              = 0b0000_1000_0000_0000_0000_0000_0000_0000;
34        const RelatedManga              = 0b0001_0000_0000_0000_0000_0000_0000_0000;
35        const Recommendations           = 0b0010_0000_0000_0000_0000_0000_0000_0000;
36        const Studios                   = 0b0100_0000_0000_0000_0000_0000_0000_0000;
37        const Statistics                = 0b1000_0000_0000_0000_0000_0000_0000_0000;
38        const ALL                       = 0b1111_1111_1111_1111_1111_1111_1111_1111;
39    }
40}
41
42macro_rules! generate_get_anime_fields_names {
43    {$ ($perm:ident => $name:expr),* $(,)?} => {
44        impl AnimeFields {
45            /// Returns a list of names of all contained fields.
46            pub fn get_fields_names(self) -> Vec<&'static str> {
47                let mut names = Vec::new();
48
49                $(
50                    if self.$perm() {
51                        names.push($name);
52                    }
53                )*
54
55                names
56            }
57        }
58    }
59}
60
61generate_get_anime_fields_names! {
62    id => "id",
63    title => "title",
64    main_picture => "main_picture",
65    alternative_titles => "alternative_titles",
66    start_date => "start_date",
67    end_date => "end_date",
68    synopsis => "synopsis",
69    mean => "mean",
70    rank => "rank",
71    popularity => "popularity",
72    num_list_users => "num_list_users",
73    num_scoring_users => "num_scoring_users",
74    nsfw => "nsfw",
75    created_at => "created_at",
76    updated_at => "updated_at",
77    media_type => "media_type",
78    status => "status",
79    genres => "genres",
80    my_list_status => "my_list_status",
81    num_episodes => "num_episodes",
82    start_season => "start_season",
83    broadcast => "broadcast",
84    source => "source",
85    average_episode_duration => "average_episode_duration",
86    rating => "rating",
87    pictures => "pictures",
88    background => "background",
89    related_anime => "related_anime",
90    related_manga => "related_manga",
91    recommendations => "recommendations",
92    studios => "studios",
93    statistics => "statistics",
94}
95
96macro_rules! bits {
97    ($($fn_name:ident => $bit_name:ident),* $(,)?) => {
98        impl AnimeFields {
99            $(
100                pub fn $fn_name(self) -> bool {
101                    self.contains(Self::$bit_name)
102                }
103            )*
104        }
105    };
106}
107
108bits!(
109    id => ID,
110    title => Title,
111    main_picture => MainPicture,
112    alternative_titles => AlternativeTitles,
113    start_date => StartDate,
114    end_date => EndDate,
115    synopsis => Synopsis,
116    mean => Mean,
117    rank => Rank,
118    popularity => Popularity,
119    num_list_users => NumListUsers,
120    num_scoring_users => NumScoringUsers,
121    nsfw => NSFW,
122    created_at => CreatedAt,
123    updated_at => UpdatedAt,
124    media_type => MediaType,
125    status => Status,
126    genres => Genres,
127    my_list_status => MyListStatus,
128    num_episodes => NumEpisodes,
129    start_season => StartSeason,
130    broadcast => Broadcast,
131    source => Source,
132    average_episode_duration => AverageEpisodeDuration,
133    rating => Rating,
134    pictures => Pictures,
135    background => Background,
136    related_anime => RelatedAnime,
137    related_manga => RelatedManga,
138    recommendations => Recommendations,
139    studios => Studios,
140    statistics => Statistics,
141);
142
143impl Display for AnimeFields {
144    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
145        write!(f, "{}", self.get_fields_names().join(","))
146    }
147}