From b13c40429fdade9ef0216034197ac7e2f88a92a6 Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Thu, 18 Jan 2024 10:01:08 +1100 Subject: [PATCH] shift state enum --- src/vehicles.rs | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/vehicles.rs b/src/vehicles.rs index bb035dc..cffe11d 100644 --- a/src/vehicles.rs +++ b/src/vehicles.rs @@ -7,7 +7,7 @@ use crate::{ get, get_args, post_arg, post_arg_empty, ApiValues, Empty, ExternalVehicleId, FleetApi, FleetVehicleApi, OwnerApi, VehicleApi, VehicleId, }; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize}; use strum::{Display, EnumString}; #[rustfmt::skip] @@ -317,7 +317,8 @@ pub struct DriveState { pub native_type: Option, pub power: i64, - pub shift_state: Option, + #[serde(deserialize_with = "map_null_to_default")] + pub shift_state: ShiftState, /// gak: I've assumed this to be String. pub speed: Option, pub timestamp: i64, @@ -325,6 +326,33 @@ pub struct DriveState { pub active_route_traffic_minutes_delay: Option, } +#[derive(Debug, Clone, Copy, Display, Deserialize, Serialize, PartialEq)] +pub enum ShiftState { + #[serde(alias = "D")] + Drive, + #[serde(alias = "N")] + Neutral, + #[serde(alias = "R")] + Reverse, + #[serde(other)] + #[serde(alias = "P")] + Parked, +} + +impl Default for ShiftState { + fn default() -> Self { + Self::Parked + } +} + +fn map_null_to_default<'de, D, T>(deserializer: D) -> Result +where + T: Default + Deserialize<'de>, + D: Deserializer<'de>, +{ + Ok(Option::deserialize(deserializer)?.unwrap_or_default()) +} + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GuiSettings { pub gui_24_hour_time: bool,