use serde::{Deserialize, Serialize};
use crate::wallet::Address;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct PmState {
pub user: Address,
pub enrolled_at_ms: u64,
pub scenarios_grid_version: u32,
pub last_margin_cents: i64,
pub eligible: bool,
pub last_concentration_penalty_bps: u16,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pm_state_round_trips() {
let s = PmState {
user: Address::ZERO,
enrolled_at_ms: 1_700_000_000_000,
scenarios_grid_version: 3,
last_margin_cents: 1_234_567,
eligible: true,
last_concentration_penalty_bps: 250,
};
let j = serde_json::to_string(&s).unwrap();
let dec: PmState = serde_json::from_str(&j).unwrap();
assert_eq!(s, dec);
}
#[test]
fn pm_state_uses_snake_case() {
let s = PmState {
user: Address::ZERO,
enrolled_at_ms: 0,
scenarios_grid_version: 1,
last_margin_cents: 0,
eligible: false,
last_concentration_penalty_bps: 0,
};
let j = serde_json::to_value(&s).unwrap();
for key in [
"enrolled_at_ms",
"scenarios_grid_version",
"last_margin_cents",
"last_concentration_penalty_bps",
] {
assert!(j.get(key).is_some(), "missing {key}");
}
}
}