ads_proto/proto/
ads_transition_mode.rs1use 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}