use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum Format {
PlainText = 1,
Html = 2,
Markdown = 3,
Json = 4,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Text {
pub text: Option<String>,
}
impl Text {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PlatImage {
pub url: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
pub image_id: Option<String>,
}
impl PlatImage {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Image {
#[serde(default)]
pub plat_image: PlatImage,
}
impl Image {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Cover {
pub url: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
}
impl Cover {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PlatVideo {
pub url: Option<String>,
pub width: Option<u32>,
pub height: Option<u32>,
pub video_id: Option<String>,
#[serde(default)]
pub cover: Cover,
}
impl PlatVideo {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Video {
#[serde(default)]
pub plat_video: PlatVideo,
}
impl Video {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Url {
pub url: Option<String>,
pub desc: Option<String>,
}
impl Url {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Elem {
#[serde(rename = "type", default)]
pub element_type: Option<u8>,
#[serde(default)]
pub text: Option<Text>,
#[serde(default)]
pub image: Option<Image>,
#[serde(default)]
pub video: Option<Video>,
#[serde(default)]
pub url: Option<Url>,
}
impl Elem {
pub fn new(data: &Value) -> Self {
let mut elem: Self = serde_json::from_value(data.clone()).unwrap_or_default();
match elem.element_type {
Some(1) => {
elem.image = None;
elem.video = None;
elem.url = None;
}
Some(2) => {
elem.text = None;
elem.video = None;
elem.url = None;
}
Some(3) => {
elem.text = None;
elem.image = None;
elem.url = None;
}
Some(4) => {
elem.text = None;
elem.image = None;
elem.video = None;
}
_ => {
elem.text = None;
elem.image = None;
elem.video = None;
elem.url = None;
}
}
elem
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Paragraph {
#[serde(default)]
pub elems: Vec<Elem>,
pub props: Option<Value>,
}
impl Paragraph {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Title {
#[serde(default)]
pub paragraphs: Vec<Paragraph>,
}
impl Title {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Content {
#[serde(default)]
pub paragraphs: Vec<Paragraph>,
}
impl Content {
pub fn new(data: &Value) -> Self {
serde_json::from_value(data.clone()).unwrap_or_default()
}
}