1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use serde::{Deserialize, Serialize};
use crate::{tag::TagItem, DynastyReaderRoute, DYNASTY_READER_BASE};
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RecentChapterConfig {
pub page_number: u64,
}
impl std::default::Default for RecentChapterConfig {
fn default() -> Self {
RecentChapterConfig { page_number: 1 }
}
}
impl DynastyReaderRoute for RecentChapterConfig {
fn request_builder(
&self,
client: &reqwest::Client,
url: reqwest::Url,
) -> reqwest::RequestBuilder {
client.get(url).query(&[("page", self.page_number)])
}
fn request_url(&self) -> reqwest::Url {
DYNASTY_READER_BASE.join("chapters/added.json").unwrap()
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct RecentChapter {
pub items: Vec<RecentChapterItem>,
pub page_number: u64,
pub max_page_number: u64,
}
impl<'de> Deserialize<'de> for RecentChapter {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
#[derive(Deserialize)]
struct RecentWrapper {
chapters: Vec<RecentChapterItem>,
current_page: u64,
total_pages: u64,
}
let wrapper: RecentWrapper = Deserialize::deserialize(deserializer)?;
let RecentWrapper {
chapters: items,
current_page: page_number,
total_pages: max_page_number,
} = wrapper;
Ok(RecentChapter {
items,
max_page_number,
page_number,
})
}
}
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct RecentChapterItem {
pub title: String,
pub series: Option<String>,
pub permalink: String,
pub tags: Vec<TagItem>,
}
#[cfg(test)]
mod tests {
use anyhow::Result;
use crate::test_utils::tryhard_configs;
use super::*;
#[tokio::test]
#[ignore = "requires internet"]
async fn response_structure() -> Result<()> {
let configs = (1..5).map(|page_number| RecentChapterConfig { page_number });
tryhard_configs(configs, |client, config| client.recent(config)).await?;
Ok(())
}
}