vndb_api/format/
character.rs

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    /// Name in the original script
13    pub original: Option<String>,
14    pub aliases: Option<Vec<String>>,
15    /// May contain formatting codes
16    pub description: Option<String>,
17    /// Same sub-fields as the image visual novel fields except for thumbnail and thumbnail_dims
18    /// because character images are currently always limited to 256x300px
19    /// but that is subject to change in the future
20    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    /// [month, day]
30    pub birthday: Option<Vec<u8>>,
31    /// The character’s apparent (non-spoiler) sex and the character’s real (spoiler) sex
32    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    /// includes vn image fields excluding thumbnail and thumbnail_dims
40    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    /// Takes all /vn fields
70    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    /// All /trait fields available here
112    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}