1use chrono::serde::ts_seconds;
3use chrono::{DateTime, Utc};
4use serde::Deserialize;
5
6pub(crate) trait AsAttrs {
7 fn attrs(&self) -> &Attrs;
8}
9
10#[derive(Clone, Debug, Deserialize)]
12pub struct Attrs {
13 pub id: String,
15
16 pub score: i32,
18
19 pub permalink: Option<String>,
21
22 #[serde(rename = "created_utc", with = "ts_seconds")]
24 pub date: DateTime<Utc>,
25}
26
27#[derive(Clone, Debug, Deserialize)]
29pub struct Comment {
30 #[serde(flatten)]
31 pub author: Author,
32
33 #[serde(flatten)]
34 pub subreddit: SubReddit,
35
36 #[serde(flatten)]
37 pub attrs: Attrs,
38
39 pub body: String,
40 pub parent_id: String,
41}
42
43impl AsAttrs for Comment {
44 fn attrs(&self) -> &Attrs {
45 &self.attrs
46 }
47}
48
49#[derive(Clone, Debug, Deserialize)]
51pub struct Post {
52 #[serde(flatten)]
53 pub author: Author,
54
55 #[serde(flatten)]
56 pub subreddit: SubReddit,
57
58 #[serde(flatten)]
59 pub attrs: Attrs,
60
61 #[serde(rename = "url")]
63 pub content_url: String,
64
65 #[serde(rename = "full_link")]
67 pub comment_url: String,
68
69 #[serde(rename = "selftext")]
71 pub self_text: Option<String>,
72}
73
74impl AsAttrs for Post {
75 fn attrs(&self) -> &Attrs {
76 &self.attrs
77 }
78}
79
80#[derive(Clone, Debug, Deserialize)]
82pub struct Author {
83 #[serde(rename = "author_fullname")]
84 pub id: Option<String>,
85 #[serde(rename = "author")]
86 pub name: String,
87}
88
89#[derive(Clone, Debug, Deserialize)]
91pub struct SubReddit {
92 #[serde(rename = "subreddit_id")]
93 pub id: String,
94 #[serde(rename = "subreddit")]
95 pub name: String,
96}