use super::FormattedValue;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IndexTrend {
#[serde(default)]
pub max_age: Option<i64>,
#[serde(default)]
pub symbol: Option<String>,
#[serde(default)]
pub estimates: Option<Vec<TrendEstimate>>,
#[serde(default)]
pub pe_ratio: Option<FormattedValue<f64>>,
#[serde(default)]
pub peg_ratio: Option<FormattedValue<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IndustryTrend {
#[serde(default)]
pub max_age: Option<i64>,
#[serde(default)]
pub symbol: Option<String>,
#[serde(default)]
pub estimates: Option<Vec<TrendEstimate>>,
#[serde(default)]
pub pe_ratio: Option<FormattedValue<f64>>,
#[serde(default)]
pub peg_ratio: Option<FormattedValue<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SectorTrend {
#[serde(default)]
pub max_age: Option<i64>,
#[serde(default)]
pub symbol: Option<String>,
#[serde(default)]
pub estimates: Option<Vec<TrendEstimate>>,
#[serde(default)]
pub pe_ratio: Option<FormattedValue<f64>>,
#[serde(default)]
pub peg_ratio: Option<FormattedValue<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TrendEstimate {
#[serde(default)]
pub period: Option<String>,
#[serde(default)]
pub growth: Option<FormattedValue<f64>>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json;
#[test]
fn test_index_trend_deserialize() {
let json = r#"{
"maxAge": 1,
"symbol": "SP5",
"estimates": [
{
"period": "0q",
"growth": {"raw": 0.1516, "fmt": "0.15"}
},
{
"period": "+1q",
"growth": {"raw": 0.067600004, "fmt": "0.07"}
}
],
"peRatio": {},
"pegRatio": {}
}"#;
let result: Result<IndexTrend, _> = serde_json::from_str(json);
assert!(
result.is_ok(),
"IndexTrend should deserialize successfully: {:?}",
result.err()
);
let trend = result.unwrap();
assert_eq!(trend.max_age, Some(1));
assert_eq!(trend.symbol, Some("SP5".to_string()));
assert!(trend.estimates.is_some());
assert_eq!(trend.estimates.as_ref().unwrap().len(), 2);
assert_eq!(
trend.pe_ratio,
Some(FormattedValue {
fmt: None,
long_fmt: None,
raw: None
})
);
assert_eq!(
trend.peg_ratio,
Some(FormattedValue {
fmt: None,
long_fmt: None,
raw: None
})
);
}
#[test]
fn test_index_trend_empty() {
let json = r#"{"maxAge": 1, "symbol": null, "estimates": []}"#;
let result: Result<IndexTrend, _> = serde_json::from_str(json);
assert!(result.is_ok());
}
}