use serde::{Deserialize, Deserializer};
use serde_json::Value;
use crate::utils::error::Error;
#[derive(Clone, Debug, Deserialize)]
#[allow(non_snake_case)]
pub struct BreezemoonContent {
#[serde(rename = "breezemoonAuthorName")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub authorName: String,
#[serde(rename = "breezemoonUpdated")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub updated: String,
#[serde(default, deserialize_with = "de_string_lossy")]
pub oId: String,
#[serde(rename = "breezemoonCreated")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub created: String,
#[serde(rename = "breezemoonAuthorThumbnailURL48")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub thumbnailURL48: String,
#[serde(default, deserialize_with = "de_string_lossy")]
pub timeAgo: String,
#[serde(rename = "breezemoonContent")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub content: String,
#[serde(rename = "breezemoonCreateTime")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub createTime: String,
#[serde(rename = "breezemoonCity")]
#[serde(default, deserialize_with = "de_string_lossy")]
pub city: String,
}
impl BreezemoonContent {
pub fn from_value(data: &Value) -> Result<Self, Error> {
serde_json::from_value(data.clone())
.map_err(|e| Error::Parse(format!("Failed to parse BreezemoonContent: {}", e)))
}
}
fn de_string_lossy<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let v = Value::deserialize(deserializer)?;
Ok(match v {
Value::String(s) => s,
Value::Number(n) => n.to_string(),
Value::Bool(b) => b.to_string(),
Value::Null => String::new(),
other => other.to_string(),
})
}