88 lines
2.0 KiB
Rust
88 lines
2.0 KiB
Rust
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,
|
|
}
|
|
}
|
|
}
|