use alloc::borrow::Cow;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct PriceStatistics<'a> {
pub mean: Cow<'a, str>,
pub size: u32,
pub standard_deviation: Cow<'a, str>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct GetAggregatePrice<'a> {
pub entire_set: PriceStatistics<'a>,
pub trimmed_set: Option<PriceStatistics<'a>>,
pub median: Cow<'a, str>,
pub time: u32,
pub ledger_current_index: u32,
pub validated: Option<bool>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_without_trim() {
let json = r#"{
"entire_set": {
"mean": "0.75",
"size": 3,
"standard_deviation": "0.05"
},
"median": "0.74",
"time": 743609014,
"ledger_current_index": 4200000
}"#;
let result: GetAggregatePrice = serde_json::from_str(json).unwrap();
assert_eq!(result.entire_set.mean, "0.75");
assert_eq!(result.entire_set.size, 3);
assert_eq!(result.median, "0.74");
assert_eq!(result.time, 743609014);
assert_eq!(result.ledger_current_index, 4200000);
assert!(result.trimmed_set.is_none());
assert!(result.validated.is_none());
}
#[test]
fn test_deserialize_with_trim() {
let json = r#"{
"entire_set": {
"mean": "0.75",
"size": 10,
"standard_deviation": "0.08"
},
"trimmed_set": {
"mean": "0.74",
"size": 6,
"standard_deviation": "0.02"
},
"median": "0.735",
"time": 743609200,
"ledger_current_index": 4200100,
"validated": false
}"#;
let result: GetAggregatePrice = serde_json::from_str(json).unwrap();
let trimmed = result.trimmed_set.unwrap();
assert_eq!(trimmed.mean, "0.74");
assert_eq!(trimmed.size, 6);
assert_eq!(result.validated, Some(false));
}
#[test]
fn test_round_trip() {
let result = GetAggregatePrice {
entire_set: PriceStatistics {
mean: "1.0".into(),
size: 2,
standard_deviation: "0.0".into(),
},
trimmed_set: None,
median: "1.0".into(),
time: 100,
ledger_current_index: 1,
validated: Some(true),
};
let serialized = serde_json::to_string(&result).unwrap();
let deserialized: GetAggregatePrice = serde_json::from_str(&serialized).unwrap();
assert_eq!(result, deserialized);
}
}