You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.6 KiB
Rust
225 lines
5.6 KiB
Rust
macro_rules! theme_include {
|
|
(
|
|
pub struct $name: ident ($include_type:literal) {
|
|
$($field: ident: $field_name: literal),+
|
|
}
|
|
) => {
|
|
#[derive(Clone, Copy, Default, Debug)]
|
|
pub struct $name {
|
|
$($field: bool),+
|
|
}
|
|
|
|
impl $name {
|
|
pub fn all() -> Self {
|
|
Self {
|
|
$($field: true),+
|
|
}
|
|
}
|
|
$(pub fn $field(mut self) -> Self {
|
|
self.$field = true;
|
|
|
|
self
|
|
}
|
|
)+
|
|
}
|
|
|
|
impl Includes for $name {
|
|
fn include_type() -> &'static str {
|
|
$include_type
|
|
}
|
|
|
|
fn includes(&self) -> Vec<String> {
|
|
let mut includes = Vec::new();
|
|
$(
|
|
if self.$field {
|
|
includes.push($field_name.into());
|
|
}
|
|
)+
|
|
|
|
includes
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub trait Includes {
|
|
fn include_type() -> &'static str;
|
|
fn includes(&self) -> Vec<String>;
|
|
}
|
|
|
|
theme_include!(
|
|
pub struct AnimeInclude ("anime") {
|
|
synonyms: "animesynonyms",
|
|
themes: "animethemes",
|
|
themes_entries: "animethemes.animethemeentries",
|
|
themes_entries_videos: "animethemes.animethemeentries.videos",
|
|
themes_song: "animethemes.song",
|
|
themes_song_artists: "animethemes.song.artists",
|
|
images: "images",
|
|
resources: "resources",
|
|
series: "series",
|
|
studios: "studios"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct AnimeImageInclude ("animeimage") {
|
|
anime: "anime",
|
|
image: "image"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct SynonymInclude ("animesynonym") {
|
|
anime: "anime"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct ThemeInclude ("animetheme") {
|
|
anime: "anime",
|
|
anime_images: "anime.images",
|
|
entries: "animethemeentries",
|
|
entries_videos: "animethemeentries.videos",
|
|
song: "song",
|
|
song_artists: "song.artists"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct ThemeEntryInclude ("animethemeentry") {
|
|
theme: "animetheme",
|
|
theme_anime: "animetheme.anime",
|
|
videos: "videos"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct ArtistInclude ("artist") {
|
|
groups: "groups",
|
|
members: "members",
|
|
resources: "resources",
|
|
songs: "songs",
|
|
songs_themes: "songs.animethemes",
|
|
songs_themes_anime: "songs.animethemes.anime"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct ImageInclude ("image") {
|
|
anime: "anime",
|
|
artists: "artists",
|
|
studios: "studios"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct ResourceInclude ("resource") {
|
|
anime: "anime",
|
|
artists: "artists",
|
|
studios: "studios"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct SeriesInclude ("series") {
|
|
anime: "anime"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct SongInclude ("song") {
|
|
themes: "animethemes",
|
|
themes_anime: "animethemes.anime",
|
|
artists: "artists"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct Studio ("studio") {
|
|
anime: "anime",
|
|
images: "images",
|
|
resources: "resources"
|
|
}
|
|
);
|
|
|
|
theme_include!(
|
|
pub struct VideoInclude ("video") {
|
|
entries: "animethemeentries",
|
|
entries_theme: "animethemeentries.animetheme",
|
|
entries_theme_anime: "animethemeentries.animetheme.anime"
|
|
}
|
|
);
|
|
|
|
#[derive(Clone, Copy, Default, Debug)]
|
|
pub struct SearchIncludes {
|
|
pub anime: AnimeInclude,
|
|
pub themes: ThemeInclude,
|
|
pub artists: ArtistInclude,
|
|
pub series: SeriesInclude,
|
|
pub songs: SongInclude,
|
|
pub videos: VideoInclude,
|
|
}
|
|
|
|
impl SearchIncludes {
|
|
pub fn all() -> Self {
|
|
Self {
|
|
anime: AnimeInclude::all(),
|
|
themes: ThemeInclude::all(),
|
|
artists: ArtistInclude::all(),
|
|
series: SeriesInclude::all(),
|
|
songs: SongInclude::all(),
|
|
videos: VideoInclude::all(),
|
|
}
|
|
}
|
|
|
|
pub fn indo_includes(self) -> Vec<(String, String)> {
|
|
let mut includes = Vec::new();
|
|
let anime_includes = self.anime.includes();
|
|
let animetheme_includes = self.themes.includes();
|
|
let artist_includes = self.artists.includes();
|
|
let series_includes = self.series.includes();
|
|
let song_includes = self.songs.includes();
|
|
let video_includes = self.videos.includes();
|
|
|
|
if !anime_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", AnimeInclude::include_type()),
|
|
anime_includes.join(","),
|
|
));
|
|
}
|
|
if !animetheme_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", ThemeInclude::include_type()),
|
|
animetheme_includes.join(","),
|
|
));
|
|
}
|
|
if !artist_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", ArtistInclude::include_type()),
|
|
artist_includes.join(","),
|
|
));
|
|
}
|
|
if !series_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", SeriesInclude::include_type()),
|
|
series_includes.join(","),
|
|
));
|
|
}
|
|
if !song_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", SongInclude::include_type()),
|
|
song_includes.join(","),
|
|
));
|
|
}
|
|
if !video_includes.is_empty() {
|
|
includes.push((
|
|
format!("include[{}]", VideoInclude::include_type()),
|
|
video_includes.join(","),
|
|
));
|
|
}
|
|
|
|
includes
|
|
}
|
|
}
|