Skip to main content

chan/
board.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5/// Per-board rate-limit cooldowns, in seconds.
6#[derive(Debug, Clone, Default, Deserialize, Serialize)]
7pub struct Cooldowns {
8    #[serde(default)]
9    pub threads: u32,
10    #[serde(default)]
11    pub replies: u32,
12    #[serde(default)]
13    pub images: u32,
14}
15
16/// A single board, as returned by `boards.json`.
17#[derive(Debug, Clone, Deserialize, Serialize)]
18pub struct Board {
19
20    /// Short slug.
21    pub board: String,
22    pub title: String,
23    pub meta_description: String,
24
25    /// `1` if work-safe.
26    #[serde(default)]
27    pub ws_board: u8,
28
29    pub per_page: u32,
30    pub pages: u32,
31
32    pub max_filesize: u64,
33    pub max_webm_filesize: u64,
34    pub max_comment_chars: u32,
35    #[serde(default)]
36    pub max_webm_duration: u32,
37
38    pub bump_limit: u32,
39    pub image_limit: u32,
40
41    #[serde(default)]
42    pub cooldowns: Cooldowns,
43
44    // Optional capability flags. Default to 0/false when omitted.
45    #[serde(default)]
46    pub spoilers: u8,
47    #[serde(default)]
48    pub custom_spoilers: u8,
49    #[serde(default)]
50    pub is_archived: u8,
51    #[serde(default)]
52    pub country_flags: u8,
53    #[serde(default)]
54    pub user_ids: u8,
55    #[serde(default)]
56    pub oekaki: u8,
57    #[serde(default)]
58    pub sjis_tags: u8,
59    #[serde(default)]
60    pub code_tags: u8,
61    #[serde(default)]
62    pub math_tags: u8,
63    #[serde(default)]
64    pub text_only: u8,
65    #[serde(default)]
66    pub forced_anon: u8,
67    #[serde(default)]
68    pub webm_audio: u8,
69    #[serde(default)]
70    pub require_subject: u8,
71    #[serde(default)]
72    pub min_image_width: u32,
73    #[serde(default)]
74    pub min_image_height: u32,
75
76    /// Map of board-specific flag codes to display names, if the board has them.
77    #[serde(default)]
78    pub board_flags: Option<HashMap<String, String>>,
79}
80
81impl Board {
82    pub fn is_ws(&self) -> bool { self.ws_board == 1 }
83    pub fn has_archive(&self) -> bool { self.is_archived == 1 }
84}
85
86#[derive(Debug, Clone, Deserialize, Serialize)]
87pub(crate) struct BoardList {
88    pub boards: Vec<Board>,
89}