use crate::*; /// A slice containing a single or double vlan header. #[derive(Clone, Debug, Eq, PartialEq)] pub enum VlanSlice<'a> { SingleVlan(SingleVlanSlice<'a>), DoubleVlan(DoubleVlanSlice<'a>), } impl<'a> VlanSlice<'a> { /// Decode all the fields and copy the results to a VlanHeader struct #[inline] pub fn to_header(&self) -> VlanHeader { use crate::VlanHeader::*; use crate::VlanSlice::*; match self { SingleVlan(value) => Single(value.to_header()), DoubleVlan(value) => Double(value.to_header()), } } #[inline] pub fn payload(&self) -> EtherPayloadSlice<'a> { match self { VlanSlice::SingleVlan(s) => s.payload(), VlanSlice::DoubleVlan(d) => d.payload(), } } } #[cfg(test)] mod test { use crate::{test_gens::*, *}; use alloc::format; use proptest::prelude::*; proptest! { #[test] fn to_header( single in vlan_single_any(), double in vlan_double_any(), ) { // single { let raw = single.to_bytes(); let slice = VlanSlice::SingleVlan( SingleVlanSlice::from_slice(&raw).unwrap() ); assert_eq!( slice.to_header(), VlanHeader::Single(single) ); } // double { let raw = double.to_bytes(); let slice = VlanSlice::DoubleVlan( DoubleVlanSlice::from_slice(&raw).unwrap() ); assert_eq!( slice.to_header(), VlanHeader::Double(double) ); } } } proptest! { #[test] fn debug( single in vlan_single_any(), double in vlan_double_any(), ) { // single { let raw = single.to_bytes(); let s = SingleVlanSlice::from_slice(&raw).unwrap(); assert_eq!( format!("{:?}", VlanSlice::SingleVlan(s.clone())), format!("SingleVlan({:?})", s) ); } // double { let raw = double.to_bytes(); let d = DoubleVlanSlice::from_slice(&raw).unwrap(); assert_eq!( format!("{:?}", VlanSlice::DoubleVlan(d.clone())), format!("DoubleVlan({:?})", d) ); } } } proptest! { #[test] fn clone_eq( single in vlan_single_any(), double in vlan_double_any(), ) { // single { let raw = single.to_bytes(); let s = VlanSlice::SingleVlan( SingleVlanSlice::from_slice(&raw).unwrap() ); assert_eq!(s.clone(), s); } // double { let raw = double.to_bytes(); let d = VlanSlice::DoubleVlan( DoubleVlanSlice::from_slice(&raw).unwrap() ); assert_eq!(d.clone(), d); } } } }