animethemes_rs/
includes.rs1macro_rules! theme_include {
2 (
3 pub struct $name: ident ($include_type:literal) {
4 $($field: ident: $field_name: literal),+
5 }
6 ) => {
7 #[derive(Clone, Copy, Default, Debug)]
8 pub struct $name {
9 $($field: bool),+
10 }
11
12 impl $name {
13 pub fn all() -> Self {
14 Self {
15 $($field: true),+
16 }
17 }
18 $(pub fn $field(mut self) -> Self {
19 self.$field = true;
20
21 self
22 }
23 )+
24 }
25
26 impl Includes for $name {
27 fn include_type() -> &'static str {
28 $include_type
29 }
30
31 fn includes(&self) -> Vec<String> {
32 let mut includes = Vec::new();
33 $(
34 if self.$field {
35 includes.push($field_name.into());
36 }
37 )+
38
39 includes
40 }
41 }
42 }
43}
44
45pub trait Includes {
46 fn include_type() -> &'static str;
47 fn includes(&self) -> Vec<String>;
48}
49
50theme_include!(
51 pub struct AnimeInclude ("anime") {
52 synonyms: "animesynonyms",
53 themes: "animethemes",
54 themes_entries: "animethemes.animethemeentries",
55 themes_entries_videos: "animethemes.animethemeentries.videos",
56 themes_song: "animethemes.song",
57 themes_song_artists: "animethemes.song.artists",
58 images: "images",
59 resources: "resources",
60 series: "series",
61 studios: "studios"
62 }
63);
64
65theme_include!(
66 pub struct AnimeImageInclude ("animeimage") {
67 anime: "anime",
68 image: "image"
69 }
70);
71
72theme_include!(
73 pub struct SynonymInclude ("animesynonym") {
74 anime: "anime"
75 }
76);
77
78theme_include!(
79 pub struct ThemeInclude ("animetheme") {
80 anime: "anime",
81 anime_images: "anime.images",
82 entries: "animethemeentries",
83 entries_videos: "animethemeentries.videos",
84 song: "song",
85 song_artists: "song.artists"
86 }
87);
88
89theme_include!(
90 pub struct ThemeEntryInclude ("animethemeentry") {
91 theme: "animetheme",
92 theme_anime: "animetheme.anime",
93 videos: "videos"
94 }
95);
96
97theme_include!(
98 pub struct ArtistInclude ("artist") {
99 groups: "groups",
100 members: "members",
101 resources: "resources",
102 songs: "songs",
103 songs_themes: "songs.animethemes",
104 songs_themes_anime: "songs.animethemes.anime"
105 }
106);
107
108theme_include!(
109 pub struct ImageInclude ("image") {
110 anime: "anime",
111 artists: "artists",
112 studios: "studios"
113 }
114);
115
116theme_include!(
117 pub struct ResourceInclude ("resource") {
118 anime: "anime",
119 artists: "artists",
120 studios: "studios"
121 }
122);
123
124theme_include!(
125 pub struct SeriesInclude ("series") {
126 anime: "anime"
127 }
128);
129
130theme_include!(
131 pub struct SongInclude ("song") {
132 themes: "animethemes",
133 themes_anime: "animethemes.anime",
134 artists: "artists"
135 }
136);
137
138theme_include!(
139 pub struct Studio ("studio") {
140 anime: "anime",
141 images: "images",
142 resources: "resources"
143 }
144);
145
146theme_include!(
147 pub struct VideoInclude ("video") {
148 entries: "animethemeentries",
149 entries_theme: "animethemeentries.animetheme",
150 entries_theme_anime: "animethemeentries.animetheme.anime"
151 }
152);
153
154#[derive(Clone, Copy, Default, Debug)]
155pub struct SearchIncludes {
156 pub anime: AnimeInclude,
157 pub themes: ThemeInclude,
158 pub artists: ArtistInclude,
159 pub series: SeriesInclude,
160 pub songs: SongInclude,
161 pub videos: VideoInclude,
162}
163
164impl SearchIncludes {
165 pub fn all() -> Self {
166 Self {
167 anime: AnimeInclude::all(),
168 themes: ThemeInclude::all(),
169 artists: ArtistInclude::all(),
170 series: SeriesInclude::all(),
171 songs: SongInclude::all(),
172 videos: VideoInclude::all(),
173 }
174 }
175
176 pub fn indo_includes(self) -> Vec<(String, String)> {
177 let mut includes = Vec::new();
178 let anime_includes = self.anime.includes();
179 let animetheme_includes = self.themes.includes();
180 let artist_includes = self.artists.includes();
181 let series_includes = self.series.includes();
182 let song_includes = self.songs.includes();
183 let video_includes = self.videos.includes();
184
185 if !anime_includes.is_empty() {
186 includes.push((
187 format!("include[{}]", AnimeInclude::include_type()),
188 anime_includes.join(","),
189 ));
190 }
191 if !animetheme_includes.is_empty() {
192 includes.push((
193 format!("include[{}]", ThemeInclude::include_type()),
194 animetheme_includes.join(","),
195 ));
196 }
197 if !artist_includes.is_empty() {
198 includes.push((
199 format!("include[{}]", ArtistInclude::include_type()),
200 artist_includes.join(","),
201 ));
202 }
203 if !series_includes.is_empty() {
204 includes.push((
205 format!("include[{}]", SeriesInclude::include_type()),
206 series_includes.join(","),
207 ));
208 }
209 if !song_includes.is_empty() {
210 includes.push((
211 format!("include[{}]", SongInclude::include_type()),
212 song_includes.join(","),
213 ));
214 }
215 if !video_includes.is_empty() {
216 includes.push((
217 format!("include[{}]", VideoInclude::include_type()),
218 video_includes.join(","),
219 ));
220 }
221
222 includes
223 }
224}