use core::task::Waker;
use crate::contract::{CatalogRef, InterfaceNo, Ordinal};
use crate::error::{CallError, Contract};
use crate::sample::{Duration, Envelope, Freshness, Provenance, Timestamp};
use crate::trace::TraceContext;
pub trait Attached {
fn catalog(&self) -> &CatalogRef;
}
pub trait Clock {
fn now(&self) -> Timestamp;
}
pub trait SignalReader: Attached {
fn read(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<RawSample, ReadError>;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RawSample {
pub provenance: Provenance,
pub freshness: Freshness,
pub envelope: Envelope,
pub len: usize,
}
pub trait SignalWriter: Attached {
fn set(&mut self, iface: InterfaceNo, ord: Ordinal, bytes: &[u8]) -> Result<(), WriteError>;
fn invalidate(&mut self, iface: InterfaceNo, ord: Ordinal) -> Result<(), WriteError>;
fn touch(&mut self, iface: InterfaceNo, ord: Ordinal) -> Result<(), WriteError>;
fn commit(&mut self);
}
pub trait EventSource: Attached {
fn subscribe(&mut self, iface: InterfaceNo, ords: &[Ordinal]) -> Result<(), SubscribeError>;
fn unsubscribe(&mut self, iface: InterfaceNo, ords: &[Ordinal]);
fn next(&mut self, out: &mut [u8]) -> Result<Option<RawOccurrence>, ReadError>;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct RawOccurrence {
pub iface: InterfaceNo,
pub ord: Ordinal,
pub envelope: Envelope,
pub trace: Option<TraceContext>,
pub len: usize,
}
pub trait EventSink: Attached {
fn raise(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
bytes: &[u8],
trace: Option<TraceContext>,
) -> Result<(), RaiseError>;
}
pub trait Caller: Attached {
fn command(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
args: &[u8],
trace: Option<TraceContext>,
) -> Result<Correlation, SendError>;
fn query(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
args: &[u8],
trace: Option<TraceContext>,
) -> Result<Correlation, SendError>;
fn ack(&mut self, c: Correlation) -> Option<Result<(), CallError>>;
fn reply(
&mut self,
c: Correlation,
out: &mut [u8],
) -> Result<Option<Result<usize, CallError>>, ReadError>;
fn forget(&mut self, c: Correlation);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Correlation(pub u64);
pub trait Handler: Attached {
fn serve(&mut self, iface: InterfaceNo, ords: &[Ordinal]) -> Result<(), ServeError>;
fn next_claim(&mut self, out: &mut [u8]) -> Result<Option<Claim>, ReadError>;
fn settle(
&mut self,
claim: ClaimId,
outcome: Result<&[u8], CallError>,
) -> Result<(), SettleError>;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Claim {
pub id: ClaimId,
pub iface: InterfaceNo,
pub ord: Ordinal,
pub envelope: Envelope,
pub trace: Option<TraceContext>,
pub remaining: Option<Duration>,
pub len: usize,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct ClaimId(pub u64);
pub trait FixedReader: Attached {
fn read_fixed(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<usize, ReadError>;
}
pub trait ScannableSignals: SignalReader {
fn generation(&self, iface: InterfaceNo) -> u64;
fn scan(&self, marks: &mut [Watermark], out: &mut [Changed]) -> usize;
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Watermark {
pub iface: InterfaceNo,
pub generation: u64,
pub seq: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Changed {
pub iface: InterfaceNo,
pub ord: Ordinal,
pub seq: u64,
}
pub trait CoherentSignals: SignalReader {
fn read_coherent(
&self,
iface: InterfaceNo,
ords: &[Ordinal],
out: &mut [u8],
samples: &mut [RawSample],
) -> Result<usize, ReadError>;
}
pub trait Wakeable {
fn wake_on(&self, what: Interest, waker: &Waker);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Interest {
Outcome(Correlation),
Slot,
Event(InterfaceNo),
Claim(InterfaceNo),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ReadError {
Short {
needed: usize,
},
ShortClaim {
claim: ClaimId,
needed: usize,
trace: Option<TraceContext>,
},
TooFewSamples {
needed: usize,
},
Contract(Contract),
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WriteError {
TooLarge {
cap: usize,
},
NotOwner,
Contract(Contract),
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RaiseError {
Busy,
TooLarge {
cap: usize,
},
NotOwner,
Contract(Contract),
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SendError {
Busy,
TooLarge {
cap: usize,
},
Contract(Contract),
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SubscribeError {
Contract(Contract),
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ServeError {
Contract(Contract),
NotOwner,
Detached,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SettleError {
UnknownClaim,
TooLarge {
cap: usize,
},
Detached,
}
impl<P: Attached + ?Sized> Attached for &P {
fn catalog(&self) -> &CatalogRef {
(**self).catalog()
}
}
impl<P: Attached + ?Sized> Attached for &mut P {
fn catalog(&self) -> &CatalogRef {
(**self).catalog()
}
}
impl<P: Clock + ?Sized> Clock for &P {
fn now(&self) -> Timestamp {
(**self).now()
}
}
impl<P: Clock + ?Sized> Clock for &mut P {
fn now(&self) -> Timestamp {
(**self).now()
}
}
impl<P: SignalReader + ?Sized> SignalReader for &P {
fn read(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<RawSample, ReadError> {
(**self).read(iface, ord, out)
}
}
impl<P: SignalReader + ?Sized> SignalReader for &mut P {
fn read(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<RawSample, ReadError> {
(**self).read(iface, ord, out)
}
}
impl<P: SignalWriter + ?Sized> SignalWriter for &mut P {
fn set(&mut self, iface: InterfaceNo, ord: Ordinal, bytes: &[u8]) -> Result<(), WriteError> {
(**self).set(iface, ord, bytes)
}
fn invalidate(&mut self, iface: InterfaceNo, ord: Ordinal) -> Result<(), WriteError> {
(**self).invalidate(iface, ord)
}
fn touch(&mut self, iface: InterfaceNo, ord: Ordinal) -> Result<(), WriteError> {
(**self).touch(iface, ord)
}
fn commit(&mut self) {
(**self).commit();
}
}
impl<P: EventSource + ?Sized> EventSource for &mut P {
fn subscribe(&mut self, iface: InterfaceNo, ords: &[Ordinal]) -> Result<(), SubscribeError> {
(**self).subscribe(iface, ords)
}
fn unsubscribe(&mut self, iface: InterfaceNo, ords: &[Ordinal]) {
(**self).unsubscribe(iface, ords);
}
fn next(&mut self, out: &mut [u8]) -> Result<Option<RawOccurrence>, ReadError> {
(**self).next(out)
}
}
impl<P: EventSink + ?Sized> EventSink for &mut P {
fn raise(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
bytes: &[u8],
trace: Option<TraceContext>,
) -> Result<(), RaiseError> {
(**self).raise(iface, ord, bytes, trace)
}
}
impl<P: Caller + ?Sized> Caller for &mut P {
fn command(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
args: &[u8],
trace: Option<TraceContext>,
) -> Result<Correlation, SendError> {
(**self).command(iface, ord, args, trace)
}
fn query(
&mut self,
iface: InterfaceNo,
ord: Ordinal,
args: &[u8],
trace: Option<TraceContext>,
) -> Result<Correlation, SendError> {
(**self).query(iface, ord, args, trace)
}
fn ack(&mut self, c: Correlation) -> Option<Result<(), CallError>> {
(**self).ack(c)
}
fn reply(
&mut self,
c: Correlation,
out: &mut [u8],
) -> Result<Option<Result<usize, CallError>>, ReadError> {
(**self).reply(c, out)
}
fn forget(&mut self, c: Correlation) {
(**self).forget(c);
}
}
impl<P: Handler + ?Sized> Handler for &mut P {
fn serve(&mut self, iface: InterfaceNo, ords: &[Ordinal]) -> Result<(), ServeError> {
(**self).serve(iface, ords)
}
fn next_claim(&mut self, out: &mut [u8]) -> Result<Option<Claim>, ReadError> {
(**self).next_claim(out)
}
fn settle(
&mut self,
claim: ClaimId,
outcome: Result<&[u8], CallError>,
) -> Result<(), SettleError> {
(**self).settle(claim, outcome)
}
}
impl<P: FixedReader + ?Sized> FixedReader for &P {
fn read_fixed(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<usize, ReadError> {
(**self).read_fixed(iface, ord, out)
}
}
impl<P: FixedReader + ?Sized> FixedReader for &mut P {
fn read_fixed(
&self,
iface: InterfaceNo,
ord: Ordinal,
out: &mut [u8],
) -> Result<usize, ReadError> {
(**self).read_fixed(iface, ord, out)
}
}
impl<P: ScannableSignals + ?Sized> ScannableSignals for &P {
fn generation(&self, iface: InterfaceNo) -> u64 {
(**self).generation(iface)
}
fn scan(&self, marks: &mut [Watermark], out: &mut [Changed]) -> usize {
(**self).scan(marks, out)
}
}
impl<P: ScannableSignals + ?Sized> ScannableSignals for &mut P {
fn generation(&self, iface: InterfaceNo) -> u64 {
(**self).generation(iface)
}
fn scan(&self, marks: &mut [Watermark], out: &mut [Changed]) -> usize {
(**self).scan(marks, out)
}
}
impl<P: CoherentSignals + ?Sized> CoherentSignals for &P {
fn read_coherent(
&self,
iface: InterfaceNo,
ords: &[Ordinal],
out: &mut [u8],
samples: &mut [RawSample],
) -> Result<usize, ReadError> {
(**self).read_coherent(iface, ords, out, samples)
}
}
impl<P: CoherentSignals + ?Sized> CoherentSignals for &mut P {
fn read_coherent(
&self,
iface: InterfaceNo,
ords: &[Ordinal],
out: &mut [u8],
samples: &mut [RawSample],
) -> Result<usize, ReadError> {
(**self).read_coherent(iface, ords, out, samples)
}
}
impl<P: Wakeable + ?Sized> Wakeable for &P {
fn wake_on(&self, what: Interest, waker: &Waker) {
(**self).wake_on(what, waker);
}
}
impl<P: Wakeable + ?Sized> Wakeable for &mut P {
fn wake_on(&self, what: Interest, waker: &Waker) {
(**self).wake_on(what, waker);
}
}