use serde::{Deserialize, Serialize};
use serde_json::{Map, Value};
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct Node {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub node_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attrs: Option<Map<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<Vec<Node>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub marks: Option<Vec<Mark>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(flatten)]
pub extra: Map<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Mark {
#[serde(rename = "type")]
pub mark_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub attrs: Option<Map<String, Value>>,
#[serde(flatten)]
pub extra: Map<String, Value>,
}
impl Mark {
#[inline]
pub fn new(mark_type: impl Into<String>) -> Self {
Mark {
mark_type: mark_type.into(),
attrs: None,
extra: Map::new(),
}
}
#[inline]
pub fn attr(mut self, key: impl Into<String>, value: impl Into<Value>) -> Self {
self.attrs
.get_or_insert_with(Map::new)
.insert(key.into(), value.into());
self
}
}