use serde::Serialize; #[derive(Serialize, PartialEq, Debug)] pub(crate) enum Level { NONE, BRONZE, SILVER, GOLD, DIAMOND, DONE, } impl Level { fn required_km(&self) -> i32 { match self { Level::BRONZE => 40000, Level::SILVER => 80000, Level::GOLD => 100000, Level::DIAMOND => 200000, Level::DONE => 0, Level::NONE => 0, } } fn next_level(km: i32) -> Self { if km < Level::BRONZE.required_km() { Level::BRONZE } else if km < Level::SILVER.required_km() { Level::SILVER } else if km < Level::GOLD.required_km() { Level::GOLD } else if km < Level::DIAMOND.required_km() { Level::DIAMOND } else { Level::DONE } } pub(crate) fn curr_level(km: i32) -> Self { if km < Level::BRONZE.required_km() { Level::NONE } else if km < Level::SILVER.required_km() { Level::BRONZE } else if km < Level::GOLD.required_km() { Level::SILVER } else if km < Level::DIAMOND.required_km() { Level::GOLD } else { Level::DIAMOND } } pub(crate) fn desc(&self) -> &str { match self { Level::BRONZE => "Bronze", Level::SILVER => "Silber", Level::GOLD => "Gold", Level::DIAMOND => "Diamant", Level::DONE => "", Level::NONE => "-", } } } #[derive(Serialize)] pub(crate) struct Next { level: Level, desc: String, missing_km: i32, required_km: i32, rowed_km: i32, } impl Next { pub(crate) fn new(rowed_km: i32) -> Self { let level = Level::next_level(rowed_km); let required_km = level.required_km(); let missing_km = required_km - rowed_km; Self { desc: level.desc().to_string(), level, missing_km, required_km, rowed_km, } } }