blob: 83890852e48ee36003e9474fee3983d64c7236a3 [file] [log] [blame]
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);
}
}
}
}