use crate::geometry::Geometry;
use super::{error::LinkError, RxMessage, TxMessage};
pub trait Link: Send {
fn open(&mut self, geometry: &Geometry) -> Result<(), LinkError>;
fn close(&mut self) -> Result<(), LinkError>;
#[doc(hidden)]
fn update(&mut self, _: &Geometry) -> Result<(), LinkError> {
Ok(())
}
fn send(&mut self, tx: &[TxMessage]) -> Result<bool, LinkError>;
fn receive(&mut self, rx: &mut [RxMessage]) -> Result<bool, LinkError>;
#[must_use]
fn is_open(&self) -> bool;
}
impl Link for Box<dyn Link> {
fn open(&mut self, geometry: &Geometry) -> Result<(), LinkError> {
self.as_mut().open(geometry)
}
fn close(&mut self) -> Result<(), LinkError> {
self.as_mut().close()
}
fn update(&mut self, geometry: &Geometry) -> Result<(), LinkError> {
self.as_mut().update(geometry)
}
fn send(&mut self, tx: &[TxMessage]) -> Result<bool, LinkError> {
self.as_mut().send(tx)
}
fn receive(&mut self, rx: &mut [RxMessage]) -> Result<bool, LinkError> {
self.as_mut().receive(rx)
}
fn is_open(&self) -> bool {
self.as_ref().is_open()
}
}