use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ForumRsp {
#[serde(default)]
pub threads: Vec<ThreadInfo>,
#[serde(default)]
pub is_finish: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PostThreadRsp {
#[serde(default)]
pub task_id: String,
#[serde(default)]
pub create_time: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ThreadInfo {
#[serde(default)]
pub title: String,
#[serde(default)]
pub content: String,
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub date_time: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PostInfo {
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub post_id: String,
#[serde(default)]
pub content: String,
#[serde(default)]
pub date_time: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ReplyInfo {
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub post_id: String,
#[serde(default)]
pub reply_id: String,
#[serde(default)]
pub content: String,
#[serde(default)]
pub date_time: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct Thread {
#[serde(default)]
pub thread_info: ThreadInfo,
#[serde(default)]
pub channel_id: String,
#[serde(default)]
pub guild_id: String,
#[serde(default)]
pub author_id: String,
#[serde(skip)]
pub event_id: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
struct ThreadWire {
#[serde(default)]
thread_info: ThreadInfo,
#[serde(default)]
channel_id: String,
#[serde(default)]
guild_id: String,
#[serde(default)]
author_id: String,
}
impl Thread {
pub(crate) fn new(event_id: Option<String>, data: &Value) -> Self {
let wire: ThreadWire = serde_json::from_value(data.clone()).unwrap_or_default();
Self {
thread_info: wire.thread_info,
channel_id: wire.channel_id,
guild_id: wire.guild_id,
author_id: wire.author_id,
event_id,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct Post {
#[serde(default)]
pub guild_id: String,
#[serde(default)]
pub channel_id: String,
#[serde(default)]
pub author_id: String,
#[serde(default)]
pub post_info: PostInfo,
#[serde(skip)]
pub event_id: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
struct PostWire {
#[serde(default)]
guild_id: String,
#[serde(default)]
channel_id: String,
#[serde(default)]
author_id: String,
#[serde(default)]
post_info: PostInfo,
}
impl Post {
pub(crate) fn new(event_id: Option<String>, data: &Value) -> Self {
let wire: PostWire = serde_json::from_value(data.clone()).unwrap_or_default();
Self {
guild_id: wire.guild_id,
channel_id: wire.channel_id,
author_id: wire.author_id,
post_info: wire.post_info,
event_id,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct Reply {
#[serde(default)]
pub guild_id: String,
#[serde(default)]
pub channel_id: String,
#[serde(default)]
pub author_id: String,
#[serde(default)]
pub reply_info: ReplyInfo,
#[serde(skip)]
pub event_id: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
struct ReplyWire {
#[serde(default)]
guild_id: String,
#[serde(default)]
channel_id: String,
#[serde(default)]
author_id: String,
#[serde(default)]
reply_info: ReplyInfo,
}
impl Reply {
pub(crate) fn new(event_id: Option<String>, data: &Value) -> Self {
let wire: ReplyWire = serde_json::from_value(data.clone()).unwrap_or_default();
Self {
guild_id: wire.guild_id,
channel_id: wire.channel_id,
author_id: wire.author_id,
reply_info: wire.reply_info,
event_id,
}
}
}