swadhinbiswas Initial release v0.1.0 · 1/16/2026
ed7a4e4
139 lines · 4.6 KB
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use serde::{Deserialize, Serialize};

// Board types
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Board {
    pub board: String,
    pub title: String,
    pub ws_board: u8,
    pub per_page: u16,
    pub pages: u16,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_description: Option<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct BoardList {
    pub boards: Vec<Board>,
}

// Post type
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Post {
    pub no: u64,
    pub resto: u64,
    pub now: String,
    pub time: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub trip: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub capcode: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub country: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub country_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sub: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub com: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tim: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub filename: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ext: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub fsize: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub md5: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub w: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub h: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tn_w: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tn_h: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub filedeleted: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub spoiler: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sticky: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub closed: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub replies: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub images: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub bumplimit: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub imagelimit: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub semantic_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub unique_ips: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_modified: Option<u64>,
}

// Thread type
#[derive(Debug, Serialize, Deserialize)]
pub struct Thread {
    pub posts: Vec<Post>,
}

// Catalog types
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CatalogThread {
    pub no: u64,
    pub last_modified: u64,
    pub replies: u32,
    pub images: u32,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub page: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sub: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub com: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tim: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub filename: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ext: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub w: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub h: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tn_w: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tn_h: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sticky: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub closed: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub bumplimit: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub imagelimit: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub semantic_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub unique_ips: Option<u32>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct CatalogPage {
    pub page: u8,
    pub threads: Vec<CatalogThread>,
}

pub type Catalog = Vec<CatalogPage>;