ads_proto/proto/
ads_transition_mode.rs

1use crate::proto::proto_traits::{ReadFrom, WriteTo};
2use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
3use std::io::{self, Read, Write};
4
5#[repr(u32)]
6#[derive(Copy, Clone, Debug, PartialEq, Eq)]
7pub enum AdsTransMode {
8    None,
9    ClientCylcle,
10    ClientOnChange,
11    Cyclic,
12    OnChange,
13    CyclicInContext,
14    OnChangeInContext,
15}
16
17impl From<u32> for AdsTransMode {
18    fn from(state_value: u32) -> Self {
19        match state_value {
20            0 => AdsTransMode::None,
21            1 => AdsTransMode::ClientCylcle,
22            2 => AdsTransMode::ClientOnChange,
23            3 => AdsTransMode::Cyclic,
24            4 => AdsTransMode::OnChange,
25            5 => AdsTransMode::CyclicInContext,
26            6 => AdsTransMode::OnChangeInContext,
27            _ => AdsTransMode::None,
28        }
29    }
30}
31
32impl WriteTo for AdsTransMode {
33    fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
34        wtr.write_u32::<LittleEndian>(self.as_u32())?;
35        Ok(())
36    }
37}
38
39impl ReadFrom for AdsTransMode {
40    fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
41        Ok(AdsTransMode::from(read.read_u32::<LittleEndian>()?))
42    }
43}
44
45impl AdsTransMode {
46    pub fn as_u32(&self) -> u32 {
47        *self as u32
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    #[test]
55    fn ads_trans_mode_from_test() {
56        assert_eq!(AdsTransMode::from(0), AdsTransMode::None);
57        assert_eq!(AdsTransMode::from(1), AdsTransMode::ClientCylcle);
58        assert_eq!(AdsTransMode::from(2), AdsTransMode::ClientOnChange);
59        assert_eq!(AdsTransMode::from(3), AdsTransMode::Cyclic);
60        assert_eq!(AdsTransMode::from(4), AdsTransMode::OnChange);
61        assert_eq!(AdsTransMode::from(5), AdsTransMode::CyclicInContext);
62        assert_eq!(AdsTransMode::from(6), AdsTransMode::OnChangeInContext);
63        assert_eq!(AdsTransMode::from(98765), AdsTransMode::None);
64    }
65
66    #[test]
67    fn ads_trans_mode_as_u32_test() {
68        assert_eq!(0, AdsTransMode::None.as_u32());
69        assert_eq!(1, AdsTransMode::ClientCylcle.as_u32());
70        assert_eq!(2, AdsTransMode::ClientOnChange.as_u32());
71        assert_eq!(3, AdsTransMode::Cyclic.as_u32());
72        assert_eq!(4, AdsTransMode::OnChange.as_u32());
73        assert_eq!(5, AdsTransMode::CyclicInContext.as_u32());
74        assert_eq!(6, AdsTransMode::OnChangeInContext.as_u32());
75    }
76
77    #[test]
78    fn ads_trans_mode_write_to_test() {
79        let compare: [u8; 4] = [3, 0, 0, 0];
80        let mut buffer: Vec<u8> = Vec::new();
81        AdsTransMode::Cyclic.write_to(&mut buffer).unwrap();
82        assert_eq!(buffer, compare);
83    }
84
85    #[test]
86    fn ads_trans_mode_read_from_test() {
87        let data: Vec<u8> = vec![3, 0, 0, 0];
88        let trans_mode = AdsTransMode::read_from(&mut data.as_slice()).unwrap();
89        assert_eq!(trans_mode, AdsTransMode::Cyclic);
90    }
91}