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 filters: Option<Value>,
28 fields: Option<String>,
30 sort: Option<SortField>,
32 reverse: Option<bool>,
34 results: Option<u8>,
37 page: Option<u8>,
39 user: Option<String>,
41 count: Option<bool>,
43 compact_filters: Option<bool>,
45 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 #[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 #[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}