use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::{Extra, Timestamp, de, time};
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Summary {
#[serde(default, deserialize_with = "de::null_as_empty")]
pub sgvs: Vec<SummarySgv>,
#[serde(default)]
pub treatments: SummaryTreatments,
#[serde(default)]
pub profile: Option<Value>,
#[serde(default)]
pub state: Option<Value>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct SummarySgv {
#[serde(default, with = "de::num")]
pub sgv: Option<f64>,
#[serde(default, with = "time::millis")]
pub mills: Option<Timestamp>,
#[serde(default, with = "de::int")]
pub noise: Option<i64>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct SummaryTreatments {
#[serde(rename = "tempBasals", default, deserialize_with = "de::null_as_empty")]
pub temp_basals: Vec<SummaryTempBasal>,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub treatments: Vec<SummaryTreatment>,
#[serde(default, deserialize_with = "de::null_as_empty")]
pub targets: Vec<SummaryTarget>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct SummaryTempBasal {
#[serde(default, with = "time::millis")]
pub start: Option<Timestamp>,
#[serde(default, with = "de::num")]
pub duration: Option<f64>,
#[serde(default, with = "de::num")]
pub absolute: Option<f64>,
#[serde(default, with = "de::text")]
pub profile: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct SummaryTreatment {
#[serde(default, with = "time::millis")]
pub mills: Option<Timestamp>,
#[serde(default, with = "de::num")]
pub carbs: Option<f64>,
#[serde(default, with = "de::num")]
pub insulin: Option<f64>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct SummaryTarget {
#[serde(default, with = "time::millis")]
pub mills: Option<Timestamp>,
#[serde(rename = "targetTop", default, with = "de::num")]
pub target_top: Option<f64>,
#[serde(rename = "targetBottom", default, with = "de::num")]
pub target_bottom: Option<f64>,
#[serde(default, with = "de::num")]
pub duration: Option<f64>,
}