use std::net::Ipv4Addr;
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct RadiusMessage {
pub code: RadiusCodeKind,
pub identifier: u8,
pub authenticator_len: usize,
pub username: Option<String>,
pub calling_station_id: Option<String>,
pub called_station_id: Option<String>,
pub nas_ip_address: Option<Ipv4Addr>,
pub framed_ip_address: Option<Ipv4Addr>,
pub has_user_password: bool,
}
#[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 RadiusCodeKind {
AccessRequest,
AccessAccept,
AccessReject,
AccessChallenge,
AccountingRequest,
AccountingResponse,
StatusServer,
StatusClient,
Other(u8),
}
impl RadiusCodeKind {
pub(crate) fn from_raw(code: u8) -> Self {
match code {
1 => Self::AccessRequest,
2 => Self::AccessAccept,
3 => Self::AccessReject,
4 => Self::AccountingRequest,
5 => Self::AccountingResponse,
11 => Self::AccessChallenge,
12 => Self::StatusServer,
13 => Self::StatusClient,
n => Self::Other(n),
}
}
pub fn as_str(&self) -> &'static str {
match self {
Self::AccessRequest => "access_request",
Self::AccessAccept => "access_accept",
Self::AccessReject => "access_reject",
Self::AccessChallenge => "access_challenge",
Self::AccountingRequest => "accounting_request",
Self::AccountingResponse => "accounting_response",
Self::StatusServer => "status_server",
Self::StatusClient => "status_client",
Self::Other(_) => "other",
}
}
}