use crate::cfg::Error;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
const fn default_clock_sigma() -> f64 {
1E-3_f64
}
const fn default_user_profile() -> Profile {
Profile::Pedestrian
}
#[derive(Default, Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Profile {
Static,
#[cfg_attr(feature = "serde", serde(alias = "pedestrian", alias = "Pedestrian"))]
#[default]
Pedestrian,
#[cfg_attr(feature = "serde", serde(alias = "car", alias = "Car"))]
Car,
#[cfg_attr(feature = "serde", serde(alias = "airplane", alias = "airplane"))]
Airplane,
#[cfg_attr(feature = "serde", serde(alias = "rocket", alias = "rocket"))]
Rocket,
}
impl std::str::FromStr for Profile {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let s = s.to_lowercase();
let trimmed = s.trim();
match trimmed {
"static" => Ok(Self::Static),
"pedestrian" => Ok(Self::Pedestrian),
"car" => Ok(Self::Car),
"airplane" => Ok(Self::Airplane),
"rocket" => Ok(Self::Rocket),
_ => Err(Error::InvalidUserProfile),
}
}
}
impl std::fmt::Display for Profile {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Static => write!(f, "Static"),
Self::Pedestrian => write!(f, "Pedestrian"),
Self::Car => write!(f, "car"),
Self::Airplane => write!(f, "airplane"),
Self::Rocket => write!(f, "rocket"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct User {
#[cfg_attr(feature = "serde", serde(default))]
pub profile: Profile,
#[cfg_attr(
feature = "serde",
serde(
alias = "clock",
alias = "clock_sigma",
default = "default_clock_sigma"
)
)]
pub clock_sigma_s: f64,
}
impl std::fmt::Display for User {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "Profile=\"{}\" ", self.profile)?;
write!(f, "clock-sigma={}s", self.clock_sigma_s)
}
}
impl Default for User {
fn default() -> Self {
Self {
profile: default_user_profile(),
clock_sigma_s: default_clock_sigma(),
}
}
}