dhcproto/v4/
opcode.rs

1use crate::{
2    decoder::{Decodable, Decoder},
3    encoder::{Encodable, Encoder},
4    error::{DecodeResult, EncodeResult},
5};
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9/// Opcode of Message
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum Opcode {
13    /// BootRequest - <https://datatracker.ietf.org/doc/html/rfc1534#section-2>
14    BootRequest,
15    /// BootReply - <https://datatracker.ietf.org/doc/html/rfc1534#section-2>
16    BootReply,
17    /// Unknown or not yet implemented
18    Unknown(u8),
19}
20
21impl Decodable for Opcode {
22    fn decode(decoder: &mut Decoder<'_>) -> DecodeResult<Self> {
23        Ok(decoder.read_u8()?.into())
24    }
25}
26
27impl Encodable for Opcode {
28    fn encode(&self, e: &'_ mut Encoder<'_>) -> EncodeResult<()> {
29        e.write_u8((*self).into())
30    }
31}
32
33impl From<u8> for Opcode {
34    fn from(opcode: u8) -> Self {
35        match opcode {
36            1 => Opcode::BootRequest,
37            2 => Opcode::BootReply,
38            _ => Opcode::Unknown(opcode),
39        }
40    }
41}
42impl From<Opcode> for u8 {
43    fn from(opcode: Opcode) -> Self {
44        match opcode {
45            Opcode::BootRequest => 1,
46            Opcode::BootReply => 2,
47            Opcode::Unknown(opcode) => opcode,
48        }
49    }
50}