Skip to main content

parse_book_source/
model.rs

1//! 领域类型(纯数据,无 IO、无规则逻辑)。
2
3use serde::{Deserialize, Serialize};
4
5/// 目录条目(章节;`is_volume` 为 true 时表示卷标题,不是可阅读章节)。
6#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
7pub struct Chapter {
8    pub title: String,
9    pub url: String,
10    #[serde(default)]
11    pub is_volume: bool,
12}
13
14/// 卷标记(分卷元数据):卷标题 + 其首章在扁平章节列表中的索引。
15#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
16pub struct Volume {
17    pub title: String,
18    pub first_chapter_index: usize,
19}
20
21/// 解析后的目录:扁平章节列表 + 平行卷元数据(卷不进入章节序列)。
22#[derive(Debug, Clone, Default, PartialEq, Eq)]
23pub struct Toc {
24    pub chapters: Vec<Chapter>,
25    pub volumes: Vec<Volume>,
26}
27
28/// 书籍详情。
29#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
30pub struct BookInfo {
31    pub name: String,
32    pub author: String,
33    pub cover: String,
34    pub intro: String,
35    pub kind: String,
36    pub last_chapter: String,
37    pub toc_url: String,
38    pub word_count: String,
39}
40
41/// 搜索/浏览结果中的一本书(书籍详情 + 入口 URL)。
42#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
43pub struct BookListItem {
44    #[serde(flatten)]
45    pub info: BookInfo,
46    pub book_url: String,
47}