use crate::listing::{Listing, ListingData};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Debug, Deserialize)]
pub struct CommentData {
#[serde(skip_serializing_if = "Option::is_none")]
pub total_awards_received: Option<i32>,
pub approved_at_utc: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub link_id: Option<String>,
pub author_flair_template_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub likes: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub saved: Option<bool>,
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gilded: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub no_follow: Option<bool>,
pub author: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub can_mod_post: Option<bool>,
pub created_utc: Option<f64>,
pub send_replies: Option<bool>,
pub parent_id: Option<String>,
pub score: Option<i32>,
pub author_fullname: Option<String>,
pub over_18: Option<bool>,
pub approved_by: Option<String>,
pub subreddit_id: Option<String>,
pub body: Option<String>,
pub link_title: Option<String>,
pub name: Option<String>,
pub author_patreon_flair: Option<bool>,
pub downs: Option<i32>,
pub is_submitter: Option<bool>,
pub body_html: Option<String>,
pub distinguished: Option<String>,
pub stickied: Option<bool>,
pub author_premium: Option<bool>,
pub can_gild: Option<bool>,
pub subreddit: Option<String>,
pub author_flair_text_color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub score_hidden: Option<bool>,
pub permalink: Option<String>,
pub num_reports: Option<i32>,
pub link_permalink: Option<String>,
pub link_author: Option<String>,
pub subreddit_name_prefixed: Option<String>,
pub author_flair_text: Option<String>,
pub link_url: Option<String>,
pub created: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub collapsed: Option<bool>,
pub controversiality: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locked: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quarantine: Option<bool>,
pub subreddit_type: Option<String>,
pub ups: Option<i32>,
pub replies: Option<MaybeReplies>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "kind", rename = "t1")]
pub struct Comment {
pub data: CommentData,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum MaybeReplies {
Reply(Listing<Comment>),
Str(String),
}
impl MaybeReplies {
pub fn replies(&mut self) -> &mut Vec<Comment> {
match self {
MaybeReplies::Reply(l) => &mut l.data.children,
MaybeReplies::Str(_) => {
*self = MaybeReplies::Reply(Listing {
data: ListingData {
modhash: None,
dist: None,
after: None,
before: None,
children: vec![],
},
});
match self {
MaybeReplies::Reply(l) => &mut l.data.children,
_ => unreachable!(),
}
}
}
}
}
impl Default for MaybeReplies {
fn default() -> Self {
MaybeReplies::Str("".to_owned())
}
}