bangumi_api/module/person/
model.rs

1use serde::{Deserialize, Serialize};
2use serde_repr::{Deserialize_repr, Serialize_repr};
3
4use crate::module::{
5    character::model::CharacterType,
6    model::{BloodType, Image, SimpleImage, Stat},
7    subject::model::SubjectType,
8};
9
10/// 人物类型枚举
11///
12/// 用于区分不同类型的人物主体,底层使用u8存储以优化空间
13#[derive(Debug, Clone, Serialize_repr, Deserialize_repr)]
14#[repr(u8)]
15pub enum PersonType {
16    /// 个人(自然人)
17    Individual = 1,
18    /// 企业(法人实体)
19    Corporation = 2,
20    /// 团体(组织或协会)
21    Association = 3,
22}
23
24/// 人物基本信息结构体
25///
26/// 包含人物的核心标识信息、职业和基础展示数据,用于列表展示等场景
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct Person {
29    /// 人物唯一标识符
30    pub id: u32,
31    /// 人物姓名
32    pub name: String,
33    /// 人物类型(个人、企业或团体)
34    pub r#type: PersonType,
35    /// 人物职业列表(如制作人、声优等)
36    pub career: Vec<PersonCareer>,
37    /// 人物图片信息
38    pub images: SimpleImage,
39    /// 简短简介
40    pub short_summary: String,
41    /// 是否被锁定(内容不可编辑)
42    pub locked: bool,
43}
44
45/// 人物职业枚举
46///
47/// 定义人物可能从事的职业类型,序列化时使用小写字母
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "lowercase")]
50pub enum PersonCareer {
51    /// 制作人
52    Producer,
53    /// 漫画家
54    Mangaka,
55    /// 艺术家/音乐人
56    Artist,
57    /// 声优(配音演员)
58    Seiyu,
59    /// 编剧
60    Writer,
61    /// 插画师
62    Illustrator,
63    /// 演员
64    Actor,
65}
66
67/// 人物搜索请求结构
68///
69/// 用于构建人物搜索的查询参数,支持关键词搜索和职业筛选
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct PersonSearch {
72    /// 搜索关键词(人物姓名或相关关键词)
73    pub keyword: String,
74    /// 可选的搜索过滤条件
75    pub filter: Option<PersonFilter>,
76}
77
78/// 人物搜索过滤条件
79///
80/// 用于细化人物搜索结果,目前支持按职业筛选
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct PersonFilter {
83    /// 可选,按职业筛选(如仅搜索声优或漫画家)
84    pub career: Option<Vec<String>>,
85}
86
87/// 人物详细信息结构体
88///
89/// 包含人物的完整信息,在基础信息之上增加了详细简介、个人属性等
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct PersonDetail {
92    /// 人物唯一标识符
93    pub id: u32,
94    /// 人物姓名
95    pub name: String,
96    /// 人物类型(个人、企业或团体)
97    pub r#type: PersonType,
98    /// 人物职业列表
99    pub career: Vec<PersonCareer>,
100    /// 人物图片信息
101    pub images: SimpleImage,
102    /// 详细简介
103    pub summary: String,
104    /// 是否被锁定(内容不可编辑)
105    pub locked: bool,
106    /// 最后修改时间(时间戳字符串)
107    pub last_modified: String,
108    /// 信息框(包含人物详细属性的键值对列表)
109    pub infobox: Vec<serde_json::Value>,
110    /// 性别(可选,如"男"、"女")
111    pub gender: Option<String>,
112    /// 血型(可选)
113    pub blood_type: Option<BloodType>,
114    /// 出生年份(可选)
115    pub birth_year: Option<u32>,
116    /// 出生月份(可选)
117    pub birth_mon: Option<u32>,
118    /// 出生日期(可选)
119    pub birth_day: Option<u32>,
120    /// 统计信息(使用Box包装以优化内存布局)
121    pub stat: Box<Stat>,
122}
123
124/// 人物关联的角色信息
125///
126/// 表示人物参与配音或创作的角色,包含角色基本信息及所属作品信息
127#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct PersonCharacter {
129    /// 角色ID
130    pub id: u32,
131    /// 角色名称
132    pub name: String,
133    /// 角色类型
134    pub r#type: CharacterType,
135    /// 角色图片信息
136    pub images: SimpleImage,
137    /// 所属条目ID
138    pub subject_id: u32,
139    /// 所属条目类型
140    pub subject_type: SubjectType,
141    /// 所属条目原名
142    pub subject_name: String,
143    /// 所属条目中文名
144    pub subject_name_cn: String,
145    /// 人物在该角色中的职位(如"配音")
146    pub staff: String,
147}
148
149/// 人物参与的条目信息
150///
151/// 表示人物参与制作的作品,包含条目基本信息及人物在该作品中的职位
152#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct PersonSubject {
154    /// 条目ID
155    pub id: u32,
156    /// 条目类型
157    pub r#type: SubjectType,
158    /// 人物在该条目中的职位(如"导演"、"编剧")
159    pub staff: String,
160    /// 条目原名
161    pub name: String,
162    /// 条目中文名
163    pub name_cn: String,
164    /// 条目图片信息(可选)
165    pub images: Option<Image>,
166}