use crate::BlockId;
use serde::Serialize;
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextBlock {
pub elements: Vec<RichTextObject>,
#[serde(skip_serializing_if = "Option::is_none")]
pub block_id: Option<BlockId>,
}
#[allow(clippy::enum_variant_names)]
#[derive(Serialize, Debug, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RichTextObject {
RichTextSection(RichTextSection),
RichTextList(RichTextList),
RichTextPreformatted(RichTextPreformatted),
RichTextQuote(RichTextQuote),
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextSection {
pub elements: Vec<RichTextElement>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextList {
pub style: RichTextListStyle,
pub elements: Vec<RichTextSection>,
#[serde(skip_serializing_if = "Option::is_none")]
pub indent: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub border: Option<u64>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum RichTextListStyle {
Bullet,
Ordered,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextPreformatted {
pub elements: Vec<RichTextElement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub border: Option<u64>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextQuote {
pub elements: Vec<RichTextElement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub border: Option<u64>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RichTextElement {
Broadcast(RichTextElementBroadcast),
Color(RichTextElementColor),
Channel(RichTextElementChannel),
Date(RichTextElementDate),
Emoji(RichTextElementEmoji),
Link(RichTextElementLink),
Text(RichTextElementText),
User(RichTextElementUser),
Usergroup(RichTextElementUsergroup),
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementBroadcast {
pub range: RichTextElementBroadcastRange,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "lowercase")]
pub enum RichTextElementBroadcastRange {
Here,
Channel,
Everyone,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementColor {
pub value: String,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementChannel {
pub channel_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RichTextStyle2>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextStyle2 {
#[serde(skip_serializing_if = "Option::is_none")]
pub bold: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub italic: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strike: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub highlight: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_highlight: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unlink: Option<bool>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementDate {
pub timestamp: u64,
pub format: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
pub fallback: Option<String>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementEmoji {
pub name: String,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementLink {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "unsafe")]
pub unsafe_: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RichTextStyle>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextStyle {
#[serde(skip_serializing_if = "Option::is_none")]
pub bold: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub italic: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub strike: Option<bool>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementText {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RichTextStyle>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementUser {
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RichTextStyle2>,
}
#[derive(Serialize, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub struct RichTextElementUsergroup {
pub usergroup_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<RichTextStyle2>,
}