use std::{
borrow::{Borrow, BorrowMut},
os::fd::{AsFd as _, AsRawFd as _, RawFd},
};
use crate::{
maps::{MapData, MapError, MapKeys, check_bounds, check_kv_size, hash_map},
programs::ProgramFd,
};
#[doc(alias = "BPF_MAP_TYPE_PROG_ARRAY")]
pub struct ProgramArray<T> {
pub(crate) inner: T,
}
impl<T: Borrow<MapData>> ProgramArray<T> {
pub(crate) fn new(map: T) -> Result<Self, MapError> {
let data = map.borrow();
check_kv_size::<u32, RawFd>(data)?;
Ok(Self { inner: map })
}
pub fn indices(&self) -> MapKeys<'_, u32> {
MapKeys::new(self.inner.borrow())
}
}
impl<T: BorrowMut<MapData>> ProgramArray<T> {
pub fn set(&mut self, index: u32, program: &ProgramFd, flags: u64) -> Result<(), MapError> {
let data = self.inner.borrow_mut();
check_bounds(data, index)?;
hash_map::insert(data, &index, &program.as_fd().as_raw_fd(), flags)
}
pub fn clear_index(&mut self, index: &u32) -> Result<(), MapError> {
let data = self.inner.borrow_mut();
check_bounds(data, *index)?;
hash_map::remove(data, index)
}
}