use alloc::{sync::Arc, vec::Vec};
use ax_errno::AxResult;
use axdevice_base::Device;
pub trait PollableDeviceOps: Send + Sync {
fn poll(&self, now_ns: u64) -> AxResult;
}
#[non_exhaustive]
pub enum DeviceRegistration {
Device(Arc<dyn Device>),
Pollable(Arc<dyn PollableDeviceOps>),
}
#[derive(Default)]
pub struct DeviceBundle {
pub(crate) devices: Vec<Arc<dyn Device>>,
pub(crate) pollable: Vec<Arc<dyn PollableDeviceOps>>,
}
impl DeviceBundle {
pub const fn new() -> Self {
Self {
devices: Vec::new(),
pollable: Vec::new(),
}
}
pub fn from_registration(registration: DeviceRegistration) -> Self {
let mut bundle = Self::new();
bundle.push(registration);
bundle
}
pub fn push(&mut self, registration: DeviceRegistration) {
match registration {
DeviceRegistration::Device(device) => self.devices.push(device),
DeviceRegistration::Pollable(device) => self.pollable.push(device),
}
}
pub fn with_registration(mut self, registration: DeviceRegistration) -> Self {
self.push(registration);
self
}
pub fn is_empty(&self) -> bool {
self.devices.is_empty() && self.pollable.is_empty()
}
}
impl From<DeviceRegistration> for DeviceBundle {
fn from(registration: DeviceRegistration) -> Self {
Self::from_registration(registration)
}
}