use std::net::Ipv4Addr;
use smallvec::SmallVec;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct NbnsMessage {
pub transaction_id: u16,
pub opcode: NbnsOpcode,
pub is_response: bool,
pub queried_name: Option<String>,
pub name_suffix: Option<u8>,
pub answer_addresses: SmallVec<[Ipv4Addr; 1]>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[non_exhaustive]
pub enum NbnsOpcode {
Query,
Registration,
Release,
Wack,
Refresh,
Other(u8),
}
impl NbnsOpcode {
pub(crate) fn from_bits(opcode: u8) -> Self {
match opcode {
0 => Self::Query,
5 => Self::Registration,
6 => Self::Release,
7 => Self::Wack,
8 => Self::Refresh,
n => Self::Other(n),
}
}
pub fn as_str(&self) -> &'static str {
match self {
Self::Query => "query",
Self::Registration => "registration",
Self::Release => "release",
Self::Wack => "wack",
Self::Refresh => "refresh",
Self::Other(_) => "other",
}
}
}