1use crate::format::producer::Producer;
2use crate::format::release::{ExtLink, Release};
3use crate::format::schema::{Language, Platform};
4use crate::format::vn::*;
5use serde::{Deserialize, Serialize};
6use serde_repr::*;
7
8#[derive(Deserialize, Serialize, Debug)]
9pub struct Character {
10 pub id: Option<String>,
11 pub name: Option<String>,
12 pub original: Option<String>,
14 pub aliases: Option<Vec<String>>,
15 pub description: Option<String>,
17 pub image: Option<CharacterImage>,
21 pub blood_type: Option<String>,
22 pub height: Option<u32>,
23 pub weight: Option<u32>,
24 pub bust: Option<u32>,
25 pub waist: Option<u32>,
26 pub hips: Option<u32>,
27 pub cup: Option<String>,
28 pub age: Option<u32>,
29 pub birthday: Option<Vec<u8>>,
31 pub gender: Option<CharacterGenderWrapper>,
33 pub vns: Option<Vec<CharacterVnRelation>>,
34 pub traits: Option<Vec<CharacterTrait>>,
35}
36
37#[derive(Deserialize, Serialize, Debug)]
38pub struct CharacterImage {
39 pub id: Option<String>,
41 pub url: Option<String>,
42 pub dims: Option<Vec<u32>>,
43 pub sexual: Option<f32>,
44 pub violence: Option<f32>,
45 pub votecount: Option<u32>,
46}
47
48#[derive(Deserialize, Serialize, Debug)]
49#[serde(untagged)]
50pub enum CharacterGenderWrapper {
51 Appearance(CharacterGender),
52 Real(CharacterGender),
53}
54
55#[derive(Deserialize, Serialize, Debug)]
56pub enum CharacterGender {
57 #[serde(rename = "m")]
58 Male,
59 #[serde(rename = "f")]
60 Female,
61 #[serde(rename = "b")]
62 Both,
63}
64
65#[derive(Deserialize, Serialize, Debug)]
66pub struct CharacterVnRelation {
67 pub spoiler: Option<u32>,
68 pub role: Option<CharacterRole>,
69 pub id: Option<String>,
71 pub title: Option<String>,
72 pub alttitle: Option<String>,
73 pub titles: Option<Vec<VnTitle>>,
74 pub aliases: Option<Vec<String>>,
75 pub olang: Option<Language>,
76 pub devstatus: Option<VnDevStatus>,
77 pub released: Option<String>,
78 pub languages: Option<Vec<Language>>,
79 pub platforms: Option<Vec<Platform>>,
80 pub image: Option<VnImage>,
81 pub length: Option<VnLength>,
82 pub length_minutes: Option<u32>,
83 pub length_votes: Option<u32>,
84 pub description: Option<String>,
85 pub rating: Option<f32>,
86 pub votecount: Option<u32>,
87 pub screenshots: Option<Vec<VnScreenShot>>,
88 pub relations: Option<Vec<VnRelation>>,
89 pub tags: Option<Vec<VnTag>>,
90 pub developers: Option<Vec<Producer>>,
91 pub editions: Option<Vec<VnEdition>>,
92 pub staff: Option<Vec<VnStaff>>,
93 pub va: Option<Vec<VnVoiceActor>>,
94 pub extlinks: Option<Vec<ExtLink>>,
95 pub release: Option<Release>,
96}
97
98#[derive(Deserialize, Serialize, Debug)]
99#[serde(rename_all = "lowercase")]
100pub enum CharacterRole {
101 Main,
102 Primary,
103 Side,
104 Appears,
105}
106
107#[derive(Deserialize, Serialize, Debug)]
108pub struct CharacterTrait {
109 pub spoiler: Option<CharacterTraitSpoiler>,
110 pub lie: Option<bool>,
111 pub id: Option<String>,
113 pub name: Option<String>,
114 pub aliases: Option<Vec<String>>,
115 pub description: Option<String>,
116 pub searchable: Option<bool>,
117 pub applicable: Option<bool>,
118 pub group_id: Option<String>,
119 pub group_name: Option<String>,
120 pub char_count: Option<u32>,
121}
122
123#[derive(Deserialize_repr, Serialize_repr, PartialEq, Debug)]
124#[repr(u8)]
125pub enum CharacterTraitSpoiler {
126 None = 0,
127 Medium = 1,
128 Big = 2,
129}