animethemes_rs/
includes.rs

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