use super::{Error, Fault, Plmn};
use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Tai5gs {
plmn: Plmn,
tac: u32,
}
impl Tai5gs {
pub fn new(plmn: Plmn, tac: u32) -> Result<Self, Error> {
if tac > 0xff_ffff {
let fault = Fault::Range {
given: tac.into(),
max: 0xff_ffff,
};
return Err(Error::new("tac", fault));
}
Ok(Self { plmn, tac })
}
pub fn plmn(&self) -> Plmn {
self.plmn
}
pub fn tac(&self) -> u32 {
self.tac
}
pub fn to_nas_octets(&self) -> [u8; 6] {
let [p1, p2, p3] = self.plmn.to_nas_octets();
let [_, t1, t2, t3] = self.tac.to_be_bytes();
[p1, p2, p3, t1, t2, t3]
}
pub fn from_nas_octets(octets: [u8; 6]) -> Result<Self, Error> {
let [p1, p2, p3, t1, t2, t3] = octets;
let plmn = Plmn::from_nas_octets([p1, p2, p3])?;
Ok(Self {
plmn,
tac: u32::from_be_bytes([0, t1, t2, t3]),
})
}
}
impl fmt::Display for Tai5gs {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}-{:06x}", self.plmn, self.tac)
}
}
impl fmt::Debug for Tai5gs {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Tai5gs({self})")
}
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TaiEps {
plmn: Plmn,
tac: u16,
}
impl TaiEps {
pub fn new(plmn: Plmn, tac: u16) -> Self {
Self { plmn, tac }
}
pub fn plmn(&self) -> Plmn {
self.plmn
}
pub fn tac(&self) -> u16 {
self.tac
}
pub fn to_nas_octets(&self) -> [u8; 5] {
let [p1, p2, p3] = self.plmn.to_nas_octets();
let [t1, t2] = self.tac.to_be_bytes();
[p1, p2, p3, t1, t2]
}
pub fn from_nas_octets(octets: [u8; 5]) -> Result<Self, Error> {
let [p1, p2, p3, t1, t2] = octets;
let plmn = Plmn::from_nas_octets([p1, p2, p3])?;
Ok(Self::new(plmn, u16::from_be_bytes([t1, t2])))
}
}
impl fmt::Display for TaiEps {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}-{:04x}", self.plmn, self.tac)
}
}
impl fmt::Debug for TaiEps {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "TaiEps({self})")
}
}