use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Segment {
#[serde(rename = "type")]
pub r#type: String,
pub data: Value,
}
impl fmt::Display for Segment {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match serde_json::to_string(self) {
Ok(json) => write!(f, "{}", json),
Err(_) => write!(f, "Segment {{ type: {}, data: {} }}", self.r#type, self.data),
}
}
}
#[macro_export]
macro_rules! segment {
(at, $target_id:expr) => {
Segment {
r#type: ElementType::At.to_string(),
data: serde_json::json!(
{
"target_id": $target_id
}
),
}
};
(text, $text:expr) => {
Segment {
r#type: ElementType::Text.to_string(),
data: serde_json::json!(
{
"text": $text
}
),
}
};
(image, $file:expr) => {
Segment {
r#type: ElementType::Image.to_string(),
data: serde_json::json!(
{
"file": $file
}
),
}
};
(reply, $message_id:expr) => {
Segment {
r#type: ElementType::Reply.to_string(),
data: serde_json::json!(
{
"message_id": $message_id
}
),
}
};
(file, $file:expr) => {
Segment {
r#type: ElementType::File.to_string(),
data: serde_json::json!(
{
"file": $file
}
),
}
};
(recording, $file:expr) => {
Segment {
r#type: ElementType::Recording.to_string(),
data: serde_json::json!(
{
"file": $file
}
),
}
};
(video, $file:expr) => {
Segment {
r#type: ElementType::Video.to_string(),
data: serde_json::json!(
{
"file": $file
}
),
}
};
(face, $id:expr) => {
Segment {
r#type: ElementType::Face.to_string(),
data: serde_json::json!(
{
"id": $id
}
),
}
};
(json, $json:expr) => {
Segment {
r#type: ElementType::Json.to_string(),
data: serde_json::json!(
{
"json": $json
}
),
}
};
(xml, $xml:expr) => {
Segment {
r#type: ElementType::Xml.to_string(),
data: serde_json::json!(
{
"xml": $xml
}
),
}
};
}