vndb_api/request/
query.rs

1use serde::{Deserialize, Serialize};
2use std::marker::PhantomData;
3use strum::IntoEnumIterator;
4use strum_macros::EnumIter;
5use serde_json::Value;
6
7#[derive(Debug)]
8pub struct VnQuery {}
9#[derive(Debug)]
10pub struct ReleaseQuery {}
11#[derive(Debug)]
12pub struct ProducerQuery {}
13#[derive(Debug)]
14pub struct CharacterQuery {}
15#[derive(Debug)]
16pub struct StaffQuery {}
17#[derive(Debug)]
18pub struct TagQuery {}
19#[derive(Debug)]
20pub struct TraitQuery {}
21#[derive(Debug)]
22pub struct UListQuery {}
23
24#[derive(Deserialize, Serialize, Debug)]
25pub struct Query<T> {
26    /// Used to determine which database items to fetch
27    filters: Option<Value>,
28    /// List of fields to fetch for each database item
29    fields: Option<String>,
30    /// Field to sort on
31    sort: Option<SortField>,
32    /// Set to true to sort in descending order
33    reverse: Option<bool>,
34    /// Number of results per page max 100
35    /// can also be set to 0 if you’re not interested in the results at all
36    results: Option<u8>,
37    /// Page number to request starting from 1
38    page: Option<u8>,
39    /// User ID
40    user: Option<String>,
41    /// Whether the response should include the count field
42    count: Option<bool>,
43    /// Whether the response should include the compact_filters field
44    compact_filters: Option<bool>,
45    /// Whether the response should include the normalized_filters field
46    normalized_filters: Option<bool>,
47    #[serde(skip)]
48    _phantom: Option<PhantomData<T>>,
49}
50
51#[derive(Debug)]
52pub struct QueryBuilder<T> {
53    pub filters: Option<Value>,
54    pub fields: Option<String>,
55    pub sort: Option<SortField>,
56    pub reverse: Option<bool>,
57    pub results: Option<u8>,
58    pub page: Option<u8>,
59    pub user: Option<String>,
60    pub count: Option<bool>,
61    pub compact_filters: Option<bool>,
62    pub normalized_filters: Option<bool>,
63    _phantom: Option<PhantomData<T>>,
64}
65
66impl<T> QueryBuilder<T> {
67    pub fn new() -> Self {
68        Self {
69            filters: None,
70            fields: None,
71            sort: Some(SortField::Id),
72            reverse: Some(false),
73            results: Some(10),
74            page: Some(1),
75            user: None,
76            count: Some(false),
77            compact_filters: Some(false),
78            normalized_filters: Some(false),
79            _phantom: None,
80        }
81    }
82
83    pub fn filters(mut self, filters: &String) -> Self {
84        match serde_json::from_str(filters) {
85            Ok(filters) => {
86                self.filters = filters;
87                return self;
88            }
89            Err(error) => { 
90                panic!("Invalid json error: {}", error); 
91            }
92        }
93    }
94
95    pub fn reverse(mut self) -> Self {
96        self.reverse = Some(true);
97        self
98    }
99
100    pub fn results(mut self, num_results: u8) -> Self {
101        self.results = Some(num_results.clamp(0, 100));
102        self
103    }
104
105    pub fn page(mut self, page_num: u8) -> Self {
106        self.page = Some(page_num);
107        self
108    }
109
110    pub fn user(mut self, user_id: &String) -> Self {
111        self.user = Some(user_id.clone());
112        self
113    }
114
115    pub fn enable_compact_filters(mut self) -> Self {
116        self.compact_filters = Some(true);
117        self
118    }
119
120    pub fn enable_normalized_filters(mut self) -> Self {
121        self.normalized_filters = Some(true);
122        self
123    }
124
125    pub fn build(self) -> Query<T> {
126        Query::<T> {
127            filters: self.filters,
128            fields: self.fields,
129            sort: self.sort,
130            reverse: self.reverse,
131            results: self.results,
132            page: self.page,
133            user: self.user,
134            count: self.count,
135            compact_filters: self.compact_filters,
136            normalized_filters: self.normalized_filters,
137            _phantom: None,
138        }
139    }
140}
141
142#[derive(Deserialize, Serialize, Debug)]
143#[serde(rename_all = "snake_case")]
144pub enum SortField {
145    Id,
146    Title,
147    Released,
148    Rating,
149    Votecount,
150    Searchrank,
151    Name,
152    VnCount,
153    CharCount,
154    Voted,
155    Vote,
156    Added,
157    Lastmod,
158    Started,
159    Finished,
160}
161
162pub struct VnFieldChoices(pub Vec<VnField>);
163
164#[derive(Serialize, Debug, EnumIter)]
165pub enum VnField {
166    #[serde(rename = "id")]
167    Id,
168    #[serde(rename = "title")]
169    Title,
170    #[serde(rename = "alttitle")]
171    Alttitle,
172    #[serde(rename = "titles.lang")]
173    TitlesLang,
174    #[serde(rename = "titles.title")]
175    TitlesTitle,
176    #[serde(rename = "titles.latin")]
177    TitlesLatin,
178    #[serde(rename = "titles.official")]
179    TitlesOfficial,
180    #[serde(rename = "titles.main")]
181    TitlesMain,
182    #[serde(rename = "aliases")]
183    Aliases,
184    #[serde(rename = "olang")]
185    Olang,
186    #[serde(rename = "devstatus")]
187    DevStatus,
188    #[serde(rename = "released")]
189    Released,
190    #[serde(rename = "languages")]
191    Languages,
192    #[serde(rename = "platforms")]
193    Platforms,
194    #[serde(rename = "image.id")]
195    ImageId,
196    #[serde(rename = "image.url")]
197    ImageUrl,
198    #[serde(rename = "image.dims")]
199    ImageDims,
200    #[serde(rename = "image.sexual")]
201    ImageSexual,
202    #[serde(rename = "image.violence")]
203    ImageViolence,
204    #[serde(rename = "image.votecount")]
205    ImageVoteCount,
206    #[serde(rename = "image.thumbnail")]
207    ImageThumbnail,
208    #[serde(rename = "image.thumbnail_dims")]
209    ImageThumbnailDims,
210    #[serde(rename = "length")]
211    Length,
212    #[serde(rename = "length_minutes")]
213    LengthMinutes,
214    #[serde(rename = "length_votes")]
215    LengthVotes,
216    #[serde(rename = "description")]
217    Description,
218    #[serde(rename = "average")]
219    Average,
220    #[serde(rename = "rating")]
221    Rating,
222    #[serde(rename = "votecount")]
223    VoteCount,
224    #[serde(rename = "screenshots.id")]
225    ScreenshotsId,
226    #[serde(rename = "screenshots.url")]
227    ScreenshotsUrl,
228    #[serde(rename = "screenshots.dims")]
229    ScreenshotsDims,
230    #[serde(rename = "screenshots.sexual")]
231    ScreenshotsSexual,
232    #[serde(rename = "screenshots.violence")]
233    ScreenshotsViolence,
234    #[serde(rename = "screenshots.votecount")]
235    ScreenshotsVoteCount,
236    #[serde(rename = "screenshots.thumbnail")]
237    ScreenshotsThumbnail,
238    #[serde(rename = "screenshots.thumbnail_dims")]
239    ScreenshotsThumbnailDims,
240    #[serde(rename = "screenshots.release.id")]
241    ScreenshotsReleaseId,
242    #[serde(rename = "screenshots.release.title")]
243    ScreenshotsReleaseTitle,
244    #[serde(rename = "relations.relation")]
245    RelationsRelation,
246    #[serde(rename = "relations.relation_official")]
247    RelationsRelationOfficial,
248    #[serde(rename = "relations.id")]
249    RelationsId,
250    #[serde(rename = "relations.title")]
251    RelationsTitle,
252    #[serde(rename = "tags.rating")]
253    TagsRating,
254    #[serde(rename = "tags.spoiler")]
255    TagsSpoiler,
256    #[serde(rename = "tags.lie")]
257    TagsLie,
258    #[serde(rename = "tags.id")]
259    TagsId,
260    #[serde(rename = "tags.name")]
261    TagsName,
262    #[serde(rename = "tags.aliases")]
263    TagsAliases,
264    #[serde(rename = "tags.description")]
265    TagsDescription,
266    #[serde(rename = "tags.category")]
267    TagsCategory,
268    #[serde(rename = "tags.searchable")]
269    TagsSearchable,
270    #[serde(rename = "tags.applicable")]
271    TagsApplicable,
272    #[serde(rename = "developers.id")]
273    DevelopersId,
274    #[serde(rename = "developers.name")]
275    DevelopersName,
276    #[serde(rename = "developers.original")]
277    DevelopersOriginal,
278    #[serde(rename = "developers.aliases")]
279    DevelopersAliases,
280    #[serde(rename = "developers.lang")]
281    DevelopersLang,
282    #[serde(rename = "developers.type")]
283    DevelopersType,
284    #[serde(rename = "developers.description")]
285    DevelopersDescription,
286    #[serde(rename = "editions.eid")]
287    EditionsEid,
288    #[serde(rename = "editions.lang")]
289    EditionsLang,
290    #[serde(rename = "editions.name")]
291    EditionsName,
292    #[serde(rename = "editions.official")]
293    EditionsOfficial,
294    #[serde(rename = "staff.eid")]
295    StaffEid,
296    #[serde(rename = "staff.role")]
297    StaffRole,
298    #[serde(rename = "staff.note")]
299    StaffNote,
300    #[serde(rename = "staff.id")]
301    StaffId,
302    #[serde(rename = "staff.aid")]
303    StaffAid,
304    #[serde(rename = "staff.ismain")]
305    StaffIsmain,
306    #[serde(rename = "staff.name")]
307    StaffName,
308    #[serde(rename = "staff.lang")]
309    StaffLang,
310    #[serde(rename = "staff.gender")]
311    StaffGender,
312    #[serde(rename = "staff.description")]
313    StaffDescription,
314    #[serde(rename = "staff.aliases.aid")]
315    StaffAliasesAid,
316    #[serde(rename = "staff.aliases.name")]
317    StaffAliasesName,
318    #[serde(rename = "staff.aliases.latin")]
319    StaffAliasesLatin,
320    #[serde(rename = "staff.aliases.ismain")]
321    StaffAliasesIsmain,
322    #[serde(rename = "va.note")]
323    VaNote,
324    #[serde(rename = "va.staff.id")]
325    VaStaffId,
326    #[serde(rename = "va.staff.aid")]
327    VaStaffAid,
328    #[serde(rename = "va.staff.ismain")]
329    VaStaffIsmain,
330    #[serde(rename = "va.staff.name")]
331    VaStaffName,
332    #[serde(rename = "va.staff.lang")]
333    VaStaffLang,
334    #[serde(rename = "va.staff.gender")]
335    VaStaffGender,
336    #[serde(rename = "va.staff.description")]
337    VaStaffDescription,
338    #[serde(rename = "va.character.id")]
339    VaCharacterId,
340    #[serde(rename = "va.character.name")]
341    VaCharacterName,
342    #[serde(rename = "va.staff.extlinks.url")]
343    VaStaffExtlinksUrl,
344    #[serde(rename = "va.staff.extlinks.label")]
345    VaStaffExtlinksLabel,
346    #[serde(rename = "va.staff.extlinks.name")]
347    VaStaffExtlinksName,
348    #[serde(rename = "va.staff.extlinks.id")]
349    VaStaffExtlinksId,
350    #[serde(rename = "va.staff.aliases.aid")]
351    VaStaffAliasesAid,
352    #[serde(rename = "va.staff.aliases.name")]
353    VaStaffAliasesName,
354    #[serde(rename = "va.staff.aliases.latin")]
355    VaStaffAliasesLatin,
356    #[serde(rename = "va.staff.aliases.ismain")]
357    VaStaffAliasesIsmain,
358}
359
360impl VnFieldChoices {
361    pub fn new() -> Self {
362        VnFieldChoices(vec![])
363    }
364
365    pub fn from(vec: Vec<VnField>) -> Self {
366        VnFieldChoices(vec)
367    }
368
369    pub fn all() -> Self {
370        let mut vec = Vec::with_capacity(VnField::iter().len());
371        for variant in VnField::iter() {
372            vec.push(variant);
373        }
374        VnFieldChoices(vec)
375    }
376}
377
378impl QueryBuilder<VnQuery> {
379    pub fn fields(mut self, fields: VnFieldChoices) -> Self {
380        self.fields = Some(
381            fields
382                .0
383                .iter()
384                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
385                .collect::<Vec<String>>()
386                .join(","),
387        );
388        self
389    }
390
391    pub fn enable_count(mut self) -> Self {
392        self.count = Some(true);
393        self
394    }
395
396    pub fn sort(mut self, sort_field: SortField) -> Self {
397        match sort_field {
398            SortField::Id
399            | SortField::Title
400            | SortField::Released
401            | SortField::Rating
402            | SortField::Votecount
403            | SortField::Searchrank => self.sort = Some(sort_field),
404            _ => return self,
405        }
406        self
407    }
408}
409
410pub struct ReleaseFieldChoices(pub Vec<ReleaseField>);
411
412#[derive(Serialize, Debug, EnumIter)]
413pub enum ReleaseField {
414    #[serde(rename = "id")]
415    Id,
416    #[serde(rename = "title")]
417    Title,
418    #[serde(rename = "alttitle")]
419    Alttitle,
420    #[serde(rename = "languages.lang")]
421    LanguagesLang,
422    #[serde(rename = "languages.title")]
423    LanguagesTitle,
424    #[serde(rename = "languages.latin")]
425    LanguagesLatin,
426    #[serde(rename = "languages.mtl")]
427    LaguagesMtl,
428    #[serde(rename = "languages.main")]
429    LanguagesMain,
430    #[serde(rename = "platforms")]
431    Platforms,
432    #[serde(rename = "media.medium")]
433    MediaMedium,
434    #[serde(rename = "media.qty")]
435    MediaQty,
436    #[serde(rename = "vns.rtype")]
437    VnsRtype,
438    #[serde(rename = "vns.id")]
439    VnsId,
440    #[serde(rename = "vns.title")]
441    VnsTitle,
442    #[serde(rename = "producers.developer")]
443    ProducersDeveloper,
444    #[serde(rename = "producers.publisher")]
445    ProducersPublisher,
446    #[serde(rename = "producers.id")]
447    ProducersId,
448    #[serde(rename = "producers.name")]
449    ProducersName,
450    #[serde(rename = "producers.original")]
451    ProducersOriginal,
452    #[serde(rename = "producers.aliases")]
453    ProducersAliases,
454    #[serde(rename = "producers.lang")]
455    ProducersLang,
456    #[serde(rename = "producers.type")]
457    ProducersType,
458    #[serde(rename = "producers.description")]
459    ProducersDescription,
460    #[serde(rename = "released")]
461    Released,
462    #[serde(rename = "minage")]
463    MinAge,
464    #[serde(rename = "patch")]
465    Patch,
466    #[serde(rename = "freeware")]
467    Freeware,
468    #[serde(rename = "uncensored")]
469    Uncensored,
470    #[serde(rename = "official")]
471    Official,
472    #[serde(rename = "has_ero")]
473    HasEro,
474    #[serde(rename = "resolution")]
475    Resolution,
476    #[serde(rename = "engine")]
477    Engine,
478    #[serde(rename = "voiced")]
479    Voiced,
480    #[serde(rename = "notes")]
481    Notes,
482    #[serde(rename = "gtin")]
483    Gtin,
484    #[serde(rename = "catalog")]
485    Catalog,
486    #[serde(rename = "extlinks.url")]
487    ExtlinksUrl,
488    #[serde(rename = "extlinks.label")]
489    ExtlinksLabel,
490    #[serde(rename = "extlinks.name")]
491    ExtlinksName,
492    #[serde(rename = "extlinks.id")]
493    ExtlinksId,
494}
495
496impl ReleaseFieldChoices {
497    pub fn new() -> Self {
498        ReleaseFieldChoices(vec![])
499    }
500
501    pub fn from(vec: Vec<ReleaseField>) -> Self {
502        ReleaseFieldChoices(vec)
503    }
504
505    pub fn all() -> Self {
506        let mut vec = Vec::with_capacity(ReleaseField::iter().len());
507        for variant in ReleaseField::iter() {
508            vec.push(variant);
509        }
510        ReleaseFieldChoices(vec)
511    }
512}
513
514impl QueryBuilder<ReleaseQuery> {
515    pub fn fields(mut self, fields: ReleaseFieldChoices) -> Self {
516        self.fields = Some(
517            fields
518                .0
519                .iter()
520                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
521                .collect::<Vec<String>>()
522                .join(","),
523        );
524        self
525    }
526
527    pub fn enable_count(mut self) -> Self {
528        self.count = Some(true);
529        self
530    }
531
532    pub fn sort(mut self, sort_field: SortField) -> Self {
533        match sort_field {
534            SortField::Id | SortField::Title | SortField::Released | SortField::Searchrank => {
535                self.sort = Some(sort_field)
536            }
537            _ => return self,
538        }
539        self
540    }
541}
542
543pub struct ProducerFieldChoices(pub Vec<ProducerField>);
544
545#[derive(Serialize, Debug, EnumIter)]
546#[serde(rename_all = "snake_case")]
547pub enum ProducerField {
548    Id,
549    Name,
550    Original,
551    Aliases,
552    Lang,
553    Type,
554    Description,
555}
556
557impl ProducerFieldChoices {
558    pub fn new() -> Self {
559        ProducerFieldChoices(vec![])
560    }
561
562    pub fn from(vec: Vec<ProducerField>) -> Self {
563        ProducerFieldChoices(vec)
564    }
565
566    pub fn all() -> Self {
567        let mut vec = Vec::with_capacity(ProducerField::iter().len());
568        for variant in ProducerField::iter() {
569            vec.push(variant);
570        }
571        ProducerFieldChoices(vec)
572    }
573}
574
575impl QueryBuilder<ProducerQuery> {
576    pub fn fields(mut self, fields: ProducerFieldChoices) -> Self {
577        self.fields = Some(
578            fields
579                .0
580                .iter()
581                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
582                .collect::<Vec<String>>()
583                .join(","),
584        );
585        self
586    }
587
588    pub fn enable_count(mut self) -> Self {
589        self.count = Some(true);
590        self
591    }
592
593    pub fn sort(mut self, sort_field: SortField) -> Self {
594        match sort_field {
595            SortField::Id | SortField::Name | SortField::Searchrank => self.sort = Some(sort_field),
596            _ => return self,
597        }
598        self
599    }
600}
601
602pub struct CharacterFieldChoices(pub Vec<CharacterField>);
603
604#[derive(Serialize, Debug, EnumIter)]
605pub enum CharacterField {
606    #[serde(rename = "id")]
607    Id,
608    #[serde(rename = "name")]
609    Name,
610    #[serde(rename = "original")]
611    Original,
612    #[serde(rename = "aliases")]
613    Aliases,
614    #[serde(rename = "description")]
615    Description,
616    #[serde(rename = "image.id")]
617    ImageId,
618    #[serde(rename = "image.url")]
619    ImageUrl,
620    #[serde(rename = "image.dims")]
621    ImageDims,
622    #[serde(rename = "image.sexual")]
623    ImageSexual,
624    #[serde(rename = "image.violence")]
625    ImageViolence,
626    #[serde(rename = "image.votecount")]
627    ImageVoteCount,
628    #[serde(rename = "blood_type")]
629    BloodType,
630    #[serde(rename = "height")]
631    Height,
632    #[serde(rename = "weight")]
633    Weight,
634    #[serde(rename = "bust")]
635    Bust,
636    #[serde(rename = "waist")]
637    Waist,
638    #[serde(rename = "hips")]
639    Hips,
640    #[serde(rename = "cup")]
641    Cup,
642    #[serde(rename = "age")]
643    Age,
644    #[serde(rename = "birthday")]
645    Birthday,
646    #[serde(rename = "sex")]
647    Sex,
648    #[serde(rename = "vns.spoiler")]
649    VnsSpoiler,
650    #[serde(rename = "vns.role")]
651    VnsRole,
652    #[serde(rename = "vns.id")]
653    VnsId,
654    #[serde(rename = "vns.title")]
655    VnsTitle,
656    #[serde(rename = "vns.release.id")]
657    VnsReleaseId,
658    #[serde(rename = "vns.release.title")]
659    VnsReleaseTitle,
660    #[serde(rename = "traits.spoiler")]
661    TraitsSpoiler,
662    #[serde(rename = "traits.lie")]
663    TraitsLie,
664    #[serde(rename = "traits.id")]
665    TraitsId,
666    #[serde(rename = "traits.name")]
667    TraitsName,
668    #[serde(rename = "traits.aliases")]
669    TraitsAliases,
670    #[serde(rename = "traits.description")]
671    TraitsDescription,
672    #[serde(rename = "traits.searchable")]
673    TraitsSearchable,
674    #[serde(rename = "traits.applicable")]
675    TraitsApplicable,
676    #[serde(rename = "traits.group_id")]
677    TraitsGroupId,
678    #[serde(rename = "traits.group_name")]
679    TraitsGroupName,
680    #[serde(rename = "traits.char_count")]
681    TraitsCharCount,
682}
683
684impl CharacterFieldChoices {
685    pub fn new() -> Self {
686        CharacterFieldChoices(vec![])
687    }
688
689    pub fn from(vec: Vec<CharacterField>) -> Self {
690        CharacterFieldChoices(vec)
691    }
692
693    pub fn all() -> Self {
694        let mut vec = Vec::with_capacity(CharacterField::iter().len());
695        for variant in CharacterField::iter() {
696            vec.push(variant);
697        }
698        CharacterFieldChoices(vec)
699    }
700}
701
702impl QueryBuilder<CharacterQuery> {
703    pub fn fields(mut self, fields: CharacterFieldChoices) -> Self {
704        self.fields = Some(
705            fields
706                .0
707                .iter()
708                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
709                .collect::<Vec<String>>()
710                .join(","),
711        );
712        self
713    }
714
715    pub fn enable_count(mut self) -> Self {
716        self.count = Some(true);
717        self
718    }
719
720    pub fn sort(mut self, sort_field: SortField) -> Self {
721        match sort_field {
722            SortField::Id | SortField::Name | SortField::Searchrank => self.sort = Some(sort_field),
723            _ => return self,
724        }
725        self
726    }
727}
728
729pub struct StaffFieldChoices(pub Vec<StaffField>);
730
731#[derive(Serialize, Debug, EnumIter)]
732pub enum StaffField {
733    #[serde(rename = "id")]
734    Id,
735    #[serde(rename = "aid")]
736    Aid,
737    #[serde(rename = "ismain")]
738    Ismain,
739    #[serde(rename = "name")]
740    Name,
741    #[serde(rename = "lang")]
742    Lang,
743    #[serde(rename = "gender")]
744    Gender,
745    #[serde(rename = "description")]
746    Description,
747    #[serde(rename = "extlinks.url")]
748    ExtlinksUrl,
749    #[serde(rename = "extlinks.label")]
750    ExtlinksLabel,
751    #[serde(rename = "extlinks.name")]
752    ExtlinksName,
753    #[serde(rename = "extlinks.id")]
754    ExtlinksId,
755    #[serde(rename = "aliases.aid")]
756    AliasesAid,
757    #[serde(rename = "aliases.name")]
758    AliasesName,
759    #[serde(rename = "aliases.latin")]
760    AliasesLatin,
761    #[serde(rename = "aliases.ismain")]
762    AliasesIsmain,
763}
764
765impl StaffFieldChoices {
766    pub fn new() -> Self {
767        StaffFieldChoices(vec![])
768    }
769
770    pub fn from(vec: Vec<StaffField>) -> Self {
771        StaffFieldChoices(vec)
772    }
773
774    pub fn all() -> Self {
775        let mut vec = Vec::with_capacity(StaffField::iter().len());
776        for variant in StaffField::iter() {
777            vec.push(variant);
778        }
779        StaffFieldChoices(vec)
780    }
781}
782
783impl QueryBuilder<StaffQuery> {
784    pub fn fields(mut self, fields: StaffFieldChoices) -> Self {
785        self.fields = Some(
786            fields
787                .0
788                .iter()
789                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
790                .collect::<Vec<String>>()
791                .join(","),
792        );
793        self
794    }
795
796    pub fn enable_count(mut self) -> Self {
797        self.count = Some(true);
798        self
799    }
800
801    pub fn sort(mut self, sort_field: SortField) -> Self {
802        match sort_field {
803            SortField::Id | SortField::Name | SortField::Searchrank => self.sort = Some(sort_field),
804            _ => return self,
805        }
806        self
807    }
808}
809
810pub struct TagFieldChoices(pub Vec<TagField>);
811
812#[derive(Serialize, Debug, EnumIter)]
813#[serde(rename_all = "lowercase")]
814pub enum TagField {
815    Id,
816    Name,
817    Aliases,
818    Description,
819    Category,
820    Searchable,
821    Applicable,
822}
823
824impl TagFieldChoices {
825    pub fn new() -> Self {
826        TagFieldChoices(vec![])
827    }
828
829    pub fn from(vec: Vec<TagField>) -> Self {
830        TagFieldChoices(vec)
831    }
832
833    pub fn all() -> Self {
834        let mut vec = Vec::with_capacity(TagField::iter().len());
835        for variant in TagField::iter() {
836            vec.push(variant);
837        }
838        TagFieldChoices(vec)
839    }
840}
841
842impl QueryBuilder<TagQuery> {
843    pub fn fields(mut self, fields: TagFieldChoices) -> Self {
844        self.fields = Some(
845            fields
846                .0
847                .iter()
848                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
849                .collect::<Vec<String>>()
850                .join(","),
851        );
852        self
853    }
854
855    pub fn enable_count(mut self) -> Self {
856        self.count = Some(true);
857        self
858    }
859
860    pub fn sort(mut self, sort_field: SortField) -> Self {
861        match sort_field {
862            SortField::Id | SortField::Name | SortField::VnCount | SortField::Searchrank => {
863                self.sort = Some(sort_field)
864            }
865            _ => return self,
866        }
867        self
868    }
869}
870
871pub struct TraitFieldChoices(pub Vec<TraitField>);
872
873#[derive(Serialize, Debug, EnumIter)]
874#[serde(rename_all = "snake_case")]
875pub enum TraitField {
876    Id,
877    Name,
878    Aliases,
879    Description,
880    Searchable,
881    Applicable,
882    GroupId,
883    GroupName,
884    CharCount,
885}
886
887impl TraitFieldChoices {
888    pub fn new() -> Self {
889        TraitFieldChoices(vec![])
890    }
891
892    pub fn from(vec: Vec<TraitField>) -> Self {
893        TraitFieldChoices(vec)
894    }
895
896    pub fn all() -> Self {
897        let mut vec = Vec::with_capacity(TraitField::iter().len());
898        for variant in TraitField::iter() {
899            vec.push(variant);
900        }
901        TraitFieldChoices(vec)
902    }
903}
904
905impl QueryBuilder<TraitQuery> {
906    pub fn fields(mut self, fields: TraitFieldChoices) -> Self {
907        self.fields = Some(
908            fields
909                .0
910                .iter()
911                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
912                .collect::<Vec<String>>()
913                .join(","),
914        );
915        self
916    }
917
918    pub fn enable_count(mut self) -> Self {
919        self.count = Some(true);
920        self
921    }
922
923    pub fn sort(mut self, sort_field: SortField) -> Self {
924        match sort_field {
925            SortField::Id | SortField::Name | SortField::CharCount | SortField::Searchrank => {
926                self.sort = Some(sort_field)
927            }
928            _ => return self,
929        }
930        self
931    }
932}
933
934pub struct UListFieldChoices(pub Vec<UListField>);
935
936#[derive(Serialize, Debug, EnumIter)]
937pub enum UListField {
938    #[serde(rename = "id")]
939    Id,
940    #[serde(rename = "added")]
941    Added,
942    #[serde(rename = "voted")]
943    Voted,
944    #[serde(rename = "lastmod")]
945    LastMod,
946    #[serde(rename = "vote")]
947    Vote,
948    #[serde(rename = "started")]
949    Started,
950    #[serde(rename = "finished")]
951    Finished,
952    #[serde(rename = "notes")]
953    Notes,
954    #[serde(rename = "labels.id")]
955    LabelsId,
956    #[serde(rename = "labels.label")]
957    LabelsLabel,
958    /// All /vn fields apply
959    #[serde(rename = "vn.id")]
960    VnId,
961    #[serde(rename = "vn.title")]
962    VnTitle,
963    #[serde(rename = "vn.alttitle")]
964    VnAlttitle,
965    #[serde(rename = "vn.titles.lang")]
966    VnTitlesLang,
967    #[serde(rename = "vn.titles.title")]
968    VnTitlesTitle,
969    #[serde(rename = "vn.titles.latin")]
970    VnTitlesLatin,
971    #[serde(rename = "vn.titles.official")]
972    VnTitlesOfficial,
973    #[serde(rename = "vn.titles.main")]
974    VnTitlesMain,
975    #[serde(rename = "vn.aliases")]
976    VnAliases,
977    #[serde(rename = "vn.olang")]
978    VnOlang,
979    #[serde(rename = "vn.devstatus")]
980    VnDevStatus,
981    #[serde(rename = "vn.released")]
982    VnReleased,
983    #[serde(rename = "vn.languages")]
984    VnLanguages,
985    #[serde(rename = "vn.platforms")]
986    VnPlatforms,
987    #[serde(rename = "vn.image.id")]
988    VnImageId,
989    #[serde(rename = "vn.image.url")]
990    VnImageUrl,
991    #[serde(rename = "vn.image.dims")]
992    VnImageDims,
993    #[serde(rename = "vn.image.sexual")]
994    VnImageSexual,
995    #[serde(rename = "vn.image.violence")]
996    VnImageViolence,
997    #[serde(rename = "vn.image.votecount")]
998    VnImageVoteCount,
999    #[serde(rename = "vn.image.thumbnail")]
1000    VnImageThumbnail,
1001    #[serde(rename = "vn.image.thumbnail_dims")]
1002    VnImageThumbnailDims,
1003    #[serde(rename = "vn.length")]
1004    VnLength,
1005    #[serde(rename = "vn.length_minutes")]
1006    VnLengthMinutes,
1007    #[serde(rename = "vn.length_votes")]
1008    VnLengthVotes,
1009    #[serde(rename = "vn.description")]
1010    VnDescription,
1011    #[serde(rename = "vn.average")]
1012    VnAverage,
1013    #[serde(rename = "vn.rating")]
1014    VnRating,
1015    #[serde(rename = "vn.votecount")]
1016    VnVoteCount,
1017    #[serde(rename = "vn.screenshots.id")]
1018    VnScreenshotsId,
1019    #[serde(rename = "vn.screenshots.url")]
1020    VnScreenshotsUrl,
1021    #[serde(rename = "vn.screenshots.dims")]
1022    VnScreenshotsDims,
1023    #[serde(rename = "vn.screenshots.sexual")]
1024    VnScreenshotsSexual,
1025    #[serde(rename = "vn.screenshots.violence")]
1026    VnScreenshotsViolence,
1027    #[serde(rename = "vn.screenshots.votecount")]
1028    VnScreenshotsVoteCount,
1029    #[serde(rename = "vn.screenshots.thumbnail")]
1030    VnScreenshotsThumbnail,
1031    #[serde(rename = "vn.screenshots.thumbnail_dims")]
1032    VnScreenshotsThumbnailDims,
1033    #[serde(rename = "vn.screenshots.release.id")]
1034    VnScreenshotsReleaseId,
1035    #[serde(rename = "vn.screenshots.release.title")]
1036    VnScreenshotsReleaseTitle,
1037    #[serde(rename = "vn.relations.relation")]
1038    VnRelationsRelation,
1039    #[serde(rename = "vn.relations.relation_official")]
1040    VnRelationsRelationOfficial,
1041    #[serde(rename = "vn.relations.id")]
1042    VnRelationsId,
1043    #[serde(rename = "vn.relations.title")]
1044    VnRelationsTitle,
1045    #[serde(rename = "vn.tags.rating")]
1046    VnTagsRating,
1047    #[serde(rename = "vn.tags.spoiler")]
1048    VnTagsSpoiler,
1049    #[serde(rename = "vn.tags.lie")]
1050    VnTagsLie,
1051    #[serde(rename = "vn.tags.id")]
1052    VnTagsId,
1053    #[serde(rename = "vn.tags.name")]
1054    VnTagsName,
1055    #[serde(rename = "vn.tags.aliases")]
1056    VnTagsAliases,
1057    #[serde(rename = "vn.tags.description")]
1058    VnTagsDescription,
1059    #[serde(rename = "vn.tags.category")]
1060    VnTagsCategory,
1061    #[serde(rename = "vn.tags.searchable")]
1062    VnTagsSearchable,
1063    #[serde(rename = "vn.tags.applicable")]
1064    VnTagsApplicable,
1065    #[serde(rename = "vn.developers.id")]
1066    VnDevelopersId,
1067    #[serde(rename = "vn.developers.name")]
1068    VnDevelopersName,
1069    #[serde(rename = "vn.developers.original")]
1070    VnDevelopersOriginal,
1071    #[serde(rename = "vn.developers.aliases")]
1072    VnDevelopersAliases,
1073    #[serde(rename = "vn.developers.lang")]
1074    VnDevelopersLang,
1075    #[serde(rename = "vn.developers.type")]
1076    VnDevelopersType,
1077    #[serde(rename = "vn.developers.description")]
1078    VnDevelopersDescription,
1079    #[serde(rename = "vn.editions.eid")]
1080    VnEditionsEid,
1081    #[serde(rename = "vn.editions.lang")]
1082    VnEditionsLang,
1083    #[serde(rename = "vn.editions.name")]
1084    VnEditionsName,
1085    #[serde(rename = "vn.editions.official")]
1086    VnEditionsOfficial,
1087    #[serde(rename = "vn.staff.eid")]
1088    VnStaffEid,
1089    #[serde(rename = "vn.staff.role")]
1090    VnStaffRole,
1091    #[serde(rename = "vn.staff.note")]
1092    VnStaffNote,
1093    #[serde(rename = "vn.staff.id")]
1094    VnStaffId,
1095    #[serde(rename = "vn.staff.aid")]
1096    VnStaffAid,
1097    #[serde(rename = "vn.staff.ismain")]
1098    VnStaffIsmain,
1099    #[serde(rename = "vn.staff.name")]
1100    VnStaffName,
1101    #[serde(rename = "vn.staff.lang")]
1102    VnStaffLang,
1103    #[serde(rename = "vn.staff.gender")]
1104    VnStaffGender,
1105    #[serde(rename = "vn.staff.description")]
1106    VnStaffDescription,
1107    #[serde(rename = "vn.staff.aliases.aid")]
1108    VnStaffAliasesAid,
1109    #[serde(rename = "vn.staff.aliases.name")]
1110    VnStaffAliasesName,
1111    #[serde(rename = "vn.staff.aliases.latin")]
1112    VnStaffAliasesLatin,
1113    #[serde(rename = "vn.staff.aliases.ismain")]
1114    VnStaffAliasesIsmain,
1115    #[serde(rename = "vn.va.note")]
1116    VnVaNote,
1117    #[serde(rename = "vn.va.staff.id")]
1118    VnVaStaffId,
1119    #[serde(rename = "vn.va.staff.aid")]
1120    VnVaStaffAid,
1121    #[serde(rename = "vn.va.staff.ismain")]
1122    VnVaStaffIsmain,
1123    #[serde(rename = "vn.va.staff.name")]
1124    VnVaStaffName,
1125    #[serde(rename = "vn.va.staff.lang")]
1126    VnVaStaffLang,
1127    #[serde(rename = "vn.va.staff.gender")]
1128    VnVaStaffGender,
1129    #[serde(rename = "vn.va.staff.description")]
1130    VnVaStaffDescription,
1131    #[serde(rename = "vn.va.character.id")]
1132    VnVaCharacterId,
1133    #[serde(rename = "vn.va.character.name")]
1134    VnVaCharacterName,
1135    #[serde(rename = "vn.va.staff.extlinks.url")]
1136    VnVaStaffExtlinksUrl,
1137    #[serde(rename = "vn.va.staff.extlinks.label")]
1138    VnVaStaffExtlinksLabel,
1139    #[serde(rename = "vn.va.staff.extlinks.name")]
1140    VnVaStaffExtlinksName,
1141    #[serde(rename = "vn.va.staff.extlinks.id")]
1142    VnVaStaffExtlinksId,
1143    #[serde(rename = "vn.va.staff.aliases.aid")]
1144    VnVaStaffAliasesAid,
1145    #[serde(rename = "vn.va.staff.aliases.name")]
1146    VnVaStaffAliasesName,
1147    #[serde(rename = "vn.va.staff.aliases.latin")]
1148    VnVaStaffAliasesLatin,
1149    #[serde(rename = "vn.va.staff.aliases.ismain")]
1150    VnVaStaffAliasesIsmain,
1151    /// All /release fields apply
1152    #[serde(rename = "releases.list_status")]
1153    ReleasesListStatus,
1154    #[serde(rename = "releases.id")]
1155    ReleasesId,
1156    #[serde(rename = "releases.title")]
1157    ReleasesTitle,
1158    #[serde(rename = "releases.alttitle")]
1159    ReleasesAlttitle,
1160    #[serde(rename = "releases.languages.lang")]
1161    ReleasesLanguagesLang,
1162    #[serde(rename = "releases.languages.title")]
1163    ReleasesLanguagesTitle,
1164    #[serde(rename = "releases.languages.latin")]
1165    ReleasesLanguagesLatin,
1166    #[serde(rename = "releases.languages.mtl")]
1167    ReleasesLaguagesMtl,
1168    #[serde(rename = "releases.languages.main")]
1169    ReleasesLanguagesMain,
1170    #[serde(rename = "releases.platforms")]
1171    ReleasesPlatforms,
1172    #[serde(rename = "releases.media.medium")]
1173    ReleasesMediaMedium,
1174    #[serde(rename = "releases.media.qty")]
1175    ReleasesMediaQty,
1176    #[serde(rename = "releases.vns.rtype")]
1177    ReleasesVnsRtype,
1178    #[serde(rename = "releases.vns.id")]
1179    ReleasesVnsId,
1180    #[serde(rename = "releases.vns.title")]
1181    ReleasesVnsTitle,
1182    #[serde(rename = "releases.producers.developer")]
1183    ReleasesProducersDeveloper,
1184    #[serde(rename = "releases.producers.publisher")]
1185    ReleasesProducersPublisher,
1186    #[serde(rename = "releases.producers.id")]
1187    ReleasesProducersId,
1188    #[serde(rename = "releases.producers.name")]
1189    ReleasesProducersName,
1190    #[serde(rename = "releases.producers.original")]
1191    ReleasesProducersOriginal,
1192    #[serde(rename = "releases.producers.aliases")]
1193    ReleasesProducersAliases,
1194    #[serde(rename = "releases.producers.lang")]
1195    ReleasesProducersLang,
1196    #[serde(rename = "releases.producers.type")]
1197    ReleasesProducersType,
1198    #[serde(rename = "releases.producers.description")]
1199    ReleasesProducersDescription,
1200    #[serde(rename = "releases.released")]
1201    ReleasesReleased,
1202    #[serde(rename = "releases.minage")]
1203    ReleasesMinAge,
1204    #[serde(rename = "releases.patch")]
1205    ReleasesPatch,
1206    #[serde(rename = "releases.freeware")]
1207    ReleasesFreeware,
1208    #[serde(rename = "releases.uncensored")]
1209    ReleasesUncensored,
1210    #[serde(rename = "releases.official")]
1211    ReleasesOfficial,
1212    #[serde(rename = "releases.has_ero")]
1213    ReleasesHasEro,
1214    #[serde(rename = "releases.resolution")]
1215    ReleasesResolution,
1216    #[serde(rename = "releases.engine")]
1217    ReleasesEngine,
1218    #[serde(rename = "releases.voiced")]
1219    ReleasesVoiced,
1220    #[serde(rename = "releases.notes")]
1221    ReleasesNotes,
1222    #[serde(rename = "releases.gtin")]
1223    ReleasesGtin,
1224    #[serde(rename = "releases.catalog")]
1225    ReleasesCatalog,
1226    #[serde(rename = "releases.extlinks.url")]
1227    ReleasesExtlinksUrl,
1228    #[serde(rename = "releases.extlinks.label")]
1229    ReleasesExtlinksLabel,
1230    #[serde(rename = "releases.extlinks.name")]
1231    ReleasesExtlinksName,
1232    #[serde(rename = "releases.extlinks.id")]
1233    ReleasesExtlinksId,
1234}
1235
1236impl UListFieldChoices {
1237    pub fn new() -> Self {
1238        UListFieldChoices(vec![])
1239    }
1240
1241    pub fn from(vec: Vec<UListField>) -> Self {
1242        UListFieldChoices(vec)
1243    }
1244
1245    pub fn all() -> Self {
1246        let mut vec = Vec::with_capacity(UListField::iter().len());
1247        for variant in UListField::iter() {
1248            vec.push(variant);
1249        }
1250        UListFieldChoices(vec)
1251    }
1252}
1253
1254impl QueryBuilder<UListQuery> {
1255    pub fn fields(mut self, fields: UListFieldChoices) -> Self {
1256        self.fields = Some(
1257            fields
1258                .0
1259                .iter()
1260                .map(|field| serde_json::to_string(&field).unwrap().replace("\"", ""))
1261                .collect::<Vec<String>>()
1262                .join(","),
1263        );
1264        self
1265    }
1266
1267    pub fn sort(mut self, sort_field: SortField) -> Self {
1268        match sort_field {
1269            SortField::Id
1270            | SortField::Title
1271            | SortField::Released
1272            | SortField::Rating
1273            | SortField::Votecount
1274            | SortField::Voted
1275            | SortField::Vote
1276            | SortField::Added
1277            | SortField::Lastmod
1278            | SortField::Started
1279            | SortField::Finished
1280            | SortField::Searchrank => self.sort = Some(sort_field),
1281            _ => return self,
1282        }
1283        self
1284    }
1285}