use serde::{Deserialize, Deserializer, Serialize, Serializer};
use crate::types::{Integer, Text, TextEntities};
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct TextQuote {
pub position: Integer,
#[serde(
deserialize_with = "RawText::deserialize_value",
flatten,
serialize_with = "RawText::serialize_value"
)]
pub text: Text,
pub is_manual: Option<bool>,
}
#[serde_with::skip_serializing_none]
#[derive(Deserialize, Serialize)]
struct RawText {
text: String,
entities: Option<TextEntities>,
}
impl RawText {
fn deserialize_value<'de, D>(deserializer: D) -> Result<Text, D::Error>
where
D: Deserializer<'de>,
{
RawText::deserialize(deserializer).map(|x| Text {
data: x.text,
entities: x.entities,
})
}
fn serialize_value<S>(value: &Text, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
RawText {
text: value.data.clone(),
entities: value.entities.clone(),
}
.serialize(serializer)
}
}