use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::{
DeviceStatus, Extra, ProfileStore, Timestamp, Treatment, de, properties::PropertySgv, time,
};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DData {
#[serde(default, deserialize_with = "de::null_as_empty")]
pub sgvs: Vec<PropertySgv>,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub mbgs: Vec<PropertySgv>,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub cals: Vec<Value>,
#[serde(default, deserialize_with = "tolerant_vec")]
pub treatments: Vec<Treatment>,
#[serde(default, deserialize_with = "tolerant_vec")]
pub profiles: Vec<ProfileStore>,
#[serde(default, deserialize_with = "tolerant_vec")]
pub devicestatus: Vec<DeviceStatus>,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub food: Vec<Value>,
#[serde(default)]
pub dbstats: Option<Value>,
#[serde(rename = "lastUpdated", default, with = "time::millis")]
pub last_updated: Option<Timestamp>,
#[serde(flatten)]
pub extra: Extra,
}
pub(crate) fn tolerant_vec<'de, D, T>(d: D) -> Result<Vec<T>, D::Error>
where
D: serde::Deserializer<'de>,
T: serde::de::DeserializeOwned,
{
Ok(Option::<Vec<Value>>::deserialize(d)?
.unwrap_or_default()
.into_iter()
.filter_map(|v| serde_json::from_value(v).ok())
.collect())
}