use core::future::poll_fn;
use emcyphal_core::{NodeId, PrioritySet, SubjectId};
use crate::frame::{Frame, Mtu};
use crate::internal;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FilterUpdate {
AddSubject(SubjectId),
RemoveSubjectRange([SubjectId; 2]),
AddDestination(NodeId),
RemoveDestinationRange([NodeId; 2]),
}
pub struct RxFilter<'a>(&'a (dyn internal::DynamicRxFilter + Sync));
impl<'a> RxFilter<'a> {
pub async fn pop(&mut self) -> FilterUpdate {
poll_fn(|cx| self.0.poll_pop(cx)).await
}
}
pub struct Rx<'a>(&'a (dyn internal::DynamicRx + Sync));
impl<'a> Rx<'a> {
pub async fn push(&mut self, frame: Frame, mtu: Mtu) {
poll_fn(|cx| self.0.poll_push(cx, &frame, mtu)).await;
}
}
pub struct Tx<'a>(&'a (dyn internal::DynamicTx + Sync));
impl<'a> Tx<'a> {
pub async fn pop(&mut self, priority_mask: PrioritySet, mtu: Mtu) -> Frame {
poll_fn(|cx| self.0.poll_pop(cx, priority_mask, mtu)).await
}
}
pub struct Link<'a>(&'a (dyn internal::DynamicLink + Sync));
impl<'a> Link<'a> {
pub fn new(access: &'a (dyn internal::DynamicLink + Sync)) -> Self {
Self(access)
}
pub fn split(self) -> (RxFilter<'a>, Rx<'a>, Tx<'a>) {
(RxFilter(self.0), Rx(self.0), Tx(self.0))
}
}