use std::borrow::Cow;
use perf_event_open_sys::bindings;
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Namespaces<'a> {
    pub pid: u32,
    pub tid: u32,
    pub namespaces: Cow<'a, [NamespaceEntry]>,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
#[repr(C)]
pub struct NamespaceEntry {
    pub dev: u64,
    pub inode: u64,
}
impl<'a> Namespaces<'a> {
    pub fn network(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::NET_NS_INDEX as usize)
    }
    pub fn uts(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::USER_NS_INDEX as usize)
    }
    pub fn ipc(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::IPC_NS_INDEX as usize)
    }
    pub fn pid(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::PID_NS_INDEX as usize)
    }
    pub fn user(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::USER_NS_INDEX as usize)
    }
    pub fn cgroup(&self) -> Option<&NamespaceEntry> {
        self.namespaces.get(bindings::CGROUP_NS_INDEX as usize)
    }
}
impl<'p> Parse<'p> for NamespaceEntry {
    fn parse<B, E>(p: &mut Parser<B, E>) -> ParseResult<Self>
    where
        E: Endian,
        B: ParseBuf<'p>,
    {
        Ok(Self {
            dev: p.parse()?,
            inode: p.parse()?,
        })
    }
}
impl<'p> Parse<'p> for Namespaces<'p> {
    fn parse<B, E>(p: &mut Parser<B, E>) -> ParseResult<Self>
    where
        E: Endian,
        B: ParseBuf<'p>,
    {
        let pid = p.parse()?;
        let tid = p.parse()?;
        let len = p.parse_u64()? as usize;
        let namespaces = unsafe { p.parse_slice(len)? };
        Ok(Self {
            pid,
            tid,
            namespaces,
        })
    }
}