use coap_handler_implementations::wkc;
struct AllNetifs;
impl coap_handler_implementations::TypeRenderable for AllNetifs {
type Get = Self;
type Put = ();
type Post = ();
fn get(&mut self) -> Result<Self::Get, u8> {
Ok(AllNetifs)
}
}
impl<C> minicbor::Encode<C> for AllNetifs
{
fn encode<W: minicbor::encode::Write>(&self, e: &mut minicbor::Encoder<W>, ctx: &mut C) -> Result<(), minicbor::encode::Error<W::Error>>
{
let e = e.begin_array()?;
for netif in riot_wrappers::gnrc::Netif::all() {
SerializedNetif(netif).encode(e, ctx)?;
}
e.end()?;
Ok(())
}
}
struct SerializedNetif(riot_wrappers::gnrc::Netif);
impl<C> minicbor::Encode<C> for SerializedNetif
{
fn encode<W: minicbor::encode::Write>(&self, e: &mut minicbor::Encoder<W>, ctx: &mut C) -> Result<(), minicbor::encode::Error<W::Error>>
{
let pidnum: i16 = self.0.pid().into();
let l2addr = serde_bytes::Bytes::new(self.0.l2addr());
let ipaddrs = self.0.ipv6_addrs();
let e = e.array(2 + ipaddrs.is_ok() as u64)?;
e.i16(pidnum)?; e.bytes(&l2addr)?;
if let Ok(ipaddrs) = ipaddrs {
let e = e.array(ipaddrs.len() as _)?;
for a in &ipaddrs {
e.tag(minicbor::data::Tag::Unassigned(54))?;
if a.is_link_local() {
#[derive(minicbor::Encode)]
struct IpWithZone<'a> {
#[cbor(n(0), encode_with = "minicbor::bytes::encode")]
ip: &'a [u8],
#[n(2)]
netif: i16,
}
IpWithZone { ip: a.raw(), netif: pidnum }.encode(e, ctx)?;
} else {
e.bytes(a.raw())?;
}
}
};
Ok(())
}
}
pub fn netif() -> impl coap_handler::Handler + coap_handler::Reporting {
wkc::ConstantSingleRecordReport::new_with_path(
coap_handler_implementations::TypeHandler::new_minicbor(AllNetifs),
&[coap_handler::Attribute::Title("Network interfaces")],
&[],
)
}