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