rkg_utils/header/
transmission_mod.rs1use std::{convert::Infallible, fmt::Display};
2
3use crate::byte_handler::{ByteHandler, ByteHandlerError, FromByteHandler};
4
5#[derive(thiserror::Error, Debug)]
7pub enum TransmissionModError {
8 #[error("Invalid transmission mod ID")]
10 InvalidTransmissionMod,
11 #[error("ByteHandler Error: {0}")]
13 ByteHandlerError(#[from] ByteHandlerError),
14 #[error("")]
16 Infallible(#[from] Infallible),
17}
18
19#[derive(Clone, Copy, Debug, PartialEq)]
25pub enum TransmissionMod {
26 Vanilla,
28 AllInside,
30 AllBikeInside,
32 AllOutside,
34}
35
36impl TryFrom<u8> for TransmissionMod {
43 type Error = TransmissionModError;
44
45 fn try_from(value: u8) -> Result<Self, Self::Error> {
46 match value {
47 0x00 => Ok(Self::Vanilla),
48 0x01 => Ok(Self::AllInside),
49 0x02 => Ok(Self::AllBikeInside),
50 0x03 => Ok(Self::AllOutside),
51 _ => Err(TransmissionModError::InvalidTransmissionMod),
52 }
53 }
54}
55
56impl From<TransmissionMod> for u8 {
58 fn from(value: TransmissionMod) -> Self {
59 match value {
60 TransmissionMod::Vanilla => 0x00,
61 TransmissionMod::AllInside => 0x01,
62 TransmissionMod::AllBikeInside => 0x02,
63 TransmissionMod::AllOutside => 0x03,
64 }
65 }
66}
67
68impl FromByteHandler for TransmissionMod {
70 type Err = TransmissionModError;
71
72 fn from_byte_handler<T>(handler: T) -> Result<Self, Self::Err>
73 where
74 T: TryInto<ByteHandler>,
75 Self::Err: From<T::Error>,
76 {
77 ((handler.try_into()?.copy_byte(0) >> 1) & 0x03).try_into()
78 }
79}
80
81impl Display for TransmissionMod {
83 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84 match self {
85 Self::Vanilla => write!(f, "Vanilla"),
86 Self::AllInside => write!(f, "All Inside"),
87 Self::AllBikeInside => write!(f, "All Bikes Inside"),
88 Self::AllOutside => write!(f, "All Outside"),
89 }
90 }
91}