use serde::{Deserialize, Serialize};
#[serde_with::skip_serializing_none]
#[derive(Default, Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
pub struct VehicleLength {
pub value: u16,
pub confidence: TrailerPresence,
}
#[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(from = "u8", into = "u8")]
pub enum TrailerPresence {
#[default]
NoTrailerPresent = 0,
TrailerPresentWithKnownLength = 1,
TrailerPresentWithUnknownLength = 2,
Unknown = 3,
Unavailable = 4,
}
impl TrailerPresence {
fn try_from(value: u8) -> Result<TrailerPresence, String> {
match value {
0 => Ok(TrailerPresence::NoTrailerPresent),
1 => Ok(TrailerPresence::TrailerPresentWithKnownLength),
2 => Ok(TrailerPresence::TrailerPresentWithUnknownLength),
3 => Ok(TrailerPresence::Unknown),
4 => Ok(TrailerPresence::Unavailable),
_ => Err(format!("Invalid trailer presence value: {value}")),
}
}
}
impl From<u8> for TrailerPresence {
fn from(value: u8) -> Self {
Self::try_from(value).unwrap_or(TrailerPresence::Unavailable)
}
}
impl From<TrailerPresence> for u8 {
fn from(trailer_presence: TrailerPresence) -> Self {
trailer_presence as u8
}
}