use serde::Deserialize;
use crate::error::Result;
use crate::usage::{KiloSnapshot, finite_amount};
#[derive(Debug, Clone, Deserialize)]
pub struct BalanceData {
pub balance: f64,
}
pub fn to_snapshot(balance: BalanceData) -> Result<KiloSnapshot> {
Ok(KiloSnapshot {
label: "Kilo".to_string(),
balance: finite_amount("kilo", "balance", balance.balance)?,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_balance() {
let raw = r#"{"balance":12.34}"#;
let d: BalanceData = serde_json::from_str(raw).unwrap();
assert_eq!(d.balance, 12.34);
}
#[test]
fn missing_balance_is_a_schema_error_not_zero() {
assert!(serde_json::from_str::<BalanceData>("{}").is_err());
assert!(serde_json::from_str::<BalanceData>(r#"{"error":"forbidden"}"#).is_err());
}
#[test]
fn non_finite_balance_is_rejected() {
let d = BalanceData { balance: f64::NAN };
assert!(to_snapshot(d).is_err());
}
#[test]
fn to_snapshot_carries_balance_and_labels_kilo() {
let snap = to_snapshot(BalanceData { balance: 8.42 }).unwrap();
assert_eq!(snap.label, "Kilo");
assert_eq!(snap.balance, 8.42);
}
}