p2sh 0.4.3

The p2sh Programming language interpreter
use std::fmt;

/// Packet object property type
/// To be kept in sync with 'PACKET_PROP_MAP'
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum PacketPropType {
    Magic,
    Major,
    Minor,
    ThisZone,
    SigFigs,
    Snaplen,
    LinkType,
    Sec,
    USec,
    Caplen,
    Wirelen,
    Payload,
    Eth,
    Src,
    Dst,
    EtherType,
    Vlan,
    Id,
    Priority,
    Dei,
    Ipv4,
    Version,
    Ihl,
    TotalLength,
    Dscp,
    Ecn,
    Flags,
    FragmentOffset,
    Ttl,
    Protocol,
    Checksum,
    Udp,
    SrcPort,
    DstPort,
    Length,
    Tcp,
    Sequence,
    Ack,
    DataOffset,
    WindowSize,
    Urgent,
    Ipv6,
    TrafficClass,
    FlowLabel,
    NextHeader,
    HopLimit,
    #[default]
    Invalid,
}

impl From<u8> for PacketPropType {
    fn from(code: u8) -> Self {
        match code {
            0 => Self::Magic,
            1 => Self::Major,
            2 => Self::Minor,
            3 => Self::ThisZone,
            4 => Self::SigFigs,
            5 => Self::Snaplen,
            6 => Self::LinkType,
            7 => Self::Sec,
            8 => Self::USec,
            9 => Self::Caplen,
            10 => Self::Wirelen,
            11 => Self::Payload,
            12 => Self::Eth,
            13 => Self::Src,
            14 => Self::Dst,
            15 => Self::EtherType,
            16 => Self::Vlan,
            17 => Self::Id,
            18 => Self::Priority,
            19 => Self::Dei,
            20 => Self::Ipv4,
            21 => Self::Version,
            22 => Self::Ihl,
            23 => Self::TotalLength,
            24 => Self::Dscp,
            25 => Self::Ecn,
            26 => Self::Flags,
            27 => Self::FragmentOffset,
            28 => Self::Ttl,
            29 => Self::Protocol,
            30 => Self::Checksum,
            31 => Self::Udp,
            32 => Self::SrcPort,
            33 => Self::DstPort,
            34 => Self::Length,
            35 => Self::Tcp,
            36 => Self::Sequence,
            37 => Self::Ack,
            38 => Self::DataOffset,
            39 => Self::WindowSize,
            40 => Self::Urgent,
            41 => Self::Ipv6,
            42 => Self::TrafficClass,
            43 => Self::FlowLabel,
            44 => Self::NextHeader,
            45 => Self::HopLimit,
            _ => Self::Invalid,
        }
    }
}

impl From<PacketPropType> for u8 {
    fn from(code: PacketPropType) -> Self {
        code as u8
    }
}

impl fmt::Display for PacketPropType {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let string_representation = match self {
            PacketPropType::Magic => "magic",
            PacketPropType::Major => "major",
            PacketPropType::Minor => "minor",
            PacketPropType::ThisZone => "thiszone",
            PacketPropType::SigFigs => "sigfigs",
            PacketPropType::Snaplen => "snaplen",
            PacketPropType::LinkType => "linktype",
            PacketPropType::Sec => "sec",
            PacketPropType::USec => "usec",
            PacketPropType::Caplen => "caplen",
            PacketPropType::Wirelen => "wirelen",
            PacketPropType::Payload => "payload",
            PacketPropType::Eth => "eth",
            PacketPropType::Src => "src",
            PacketPropType::Dst => "dst",
            PacketPropType::EtherType => "type",
            PacketPropType::Vlan => "vlan",
            PacketPropType::Id => "id",
            PacketPropType::Priority => "priority",
            PacketPropType::Dei => "dei",
            PacketPropType::Ipv4 => "ipv4",
            PacketPropType::Version => "version",
            PacketPropType::Ihl => "ihl",
            PacketPropType::TotalLength => "totlen",
            PacketPropType::Dscp => "dscp",
            PacketPropType::Ecn => "ecn",
            PacketPropType::Flags => "flags",
            PacketPropType::FragmentOffset => "fragoff",
            PacketPropType::Ttl => "ttl",
            PacketPropType::Protocol => "proto",
            PacketPropType::Checksum => "checksum",
            PacketPropType::Udp => "udp",
            PacketPropType::SrcPort => "srcport",
            PacketPropType::DstPort => "dstport",
            PacketPropType::Length => "len",
            PacketPropType::Tcp => "tcp",
            PacketPropType::Sequence => "seq",
            PacketPropType::Ack => "ack",
            PacketPropType::DataOffset => "dataoff",
            PacketPropType::WindowSize => "winsize",
            PacketPropType::Urgent => "urgent",
            PacketPropType::Ipv6 => "ipv6",
            PacketPropType::TrafficClass => "trafficclass",
            PacketPropType::FlowLabel => "flowlabel",
            PacketPropType::NextHeader => "nextheader",
            PacketPropType::HopLimit => "hoplimit",
            PacketPropType::Invalid => "invalid",
        };
        write!(f, "{}", string_representation)
    }
}