use serde::{Deserialize, Deserializer, Serialize};
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct LevelInfo {
pub current_level: i32,
pub current_min: i32,
pub current_exp: i32,
#[serde(deserialize_with = "deserialize_next_exp")]
pub next_exp: NextExp,
}
#[derive(Debug, Clone, Serialize)]
pub enum NextExp {
Value(i32),
Infinite,
}
impl Default for NextExp {
fn default() -> Self {
NextExp::Infinite
}
}
fn deserialize_next_exp<'de, D>(deserializer: D) -> Result<NextExp, D::Error>
where
D: Deserializer<'de>,
{
let s: serde_json::Value = Deserialize::deserialize(deserializer)?;
match s {
serde_json::Value::String(ref str_val) if str_val == "--" => Ok(NextExp::Infinite),
serde_json::Value::Number(num) => Ok(NextExp::Value(num.as_i64().unwrap_or(0) as i32)),
_ => Ok(NextExp::Infinite),
}
}