1use std::num::NonZeroU32;
2use time::OffsetDateTime;
3
4#[derive(Debug, serde::Serialize, serde::Deserialize)]
6pub struct Post {
7 pub id: Box<str>,
9
10 pub title: Option<Box<str>>,
12
13 pub username: Box<str>,
15
16 pub privacy: Privacy,
18
19 pub report_status: i32,
21
22 pub views: u64,
24
25 #[serde(with = "crate::serde::u8_to_bool")]
27 pub nsfw: bool,
28
29 pub image_count: u64,
31
32 #[serde(with = "time::serde::iso8601")]
34 pub created: OffsetDateTime,
35
36 pub images: Box<[File]>,
38
39 pub delete_url: Option<Box<str>>,
43 }
46
47#[derive(Debug, serde::Serialize, serde::Deserialize)]
49pub struct File {
50 pub id: Box<str>,
52
53 pub description: Option<Box<str>>,
55
56 pub link: Box<str>,
58
59 pub position: NonZeroU32,
63
64 #[serde(with = "time::serde::iso8601")]
66 pub created: OffsetDateTime,
67
68 pub original_name: Option<Box<str>>,
72 }
75
76#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
78pub enum Privacy {
79 #[serde(rename = "public")]
80 Public,
81
82 #[serde(rename = "hidden")]
83 Hidden,
84
85 #[serde(rename = "secret")]
86 Secret,
87}
88
89impl Privacy {
90 pub fn as_str(self) -> &'static str {
92 match self {
93 Self::Public => "public",
94 Self::Hidden => "hidden",
95 Self::Secret => "secret",
96 }
97 }
98}