lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

host_transport.rs (2236B)


      1 use radroots_transport::{
      2     BoxSubscription, DeliveryReceipt, DeliveryRequest, Error, EventSink, EventSource,
      3     EventSubscriber, FetchPage, FetchRequest, SubscriptionRequest, TransportId,
      4     capability::{Availability, Maturity, SinkCapabilities, SourceCapabilities},
      5     sink::SinkStatus,
      6     source::{BoxFuture, SourceStatus},
      7 };
      8 
      9 struct HostTransport;
     10 
     11 impl EventSource for HostTransport {
     12     fn status(&self) -> BoxFuture<'_, Result<SourceStatus, Error>> {
     13         Box::pin(async {
     14             Ok(SourceStatus::new(
     15                 TransportId::LOCAL,
     16                 true,
     17                 Maturity::Preview,
     18                 Availability::Unavailable,
     19                 SourceCapabilities::NONE,
     20                 "host source is not connected",
     21             ))
     22         })
     23     }
     24 
     25     fn fetch(&self, _request: FetchRequest) -> BoxFuture<'_, Result<FetchPage, Error>> {
     26         Box::pin(async { Err(Error::UnsupportedOperation) })
     27     }
     28 }
     29 
     30 impl EventSubscriber for HostTransport {
     31     fn subscribe(
     32         &self,
     33         _request: SubscriptionRequest,
     34     ) -> BoxFuture<'_, Result<BoxSubscription, Error>> {
     35         Box::pin(async { Err(Error::UnsupportedOperation) })
     36     }
     37 }
     38 
     39 impl EventSink for HostTransport {
     40     fn status(&self) -> BoxFuture<'_, Result<SinkStatus, Error>> {
     41         Box::pin(async {
     42             Ok(SinkStatus::new(
     43                 TransportId::LOCAL,
     44                 true,
     45                 Maturity::Preview,
     46                 Availability::Unavailable,
     47                 SinkCapabilities::NONE,
     48                 "host sink is not connected",
     49             ))
     50         })
     51     }
     52 
     53     fn deliver(
     54         &self,
     55         _request: DeliveryRequest,
     56     ) -> BoxFuture<'_, Result<DeliveryReceipt, radroots_transport::SinkFailure>> {
     57         Box::pin(async move { Err(radroots_transport::SinkFailure::invalid_contract(&_request)) })
     58     }
     59 }
     60 
     61 fn main() {
     62     let transport = HostTransport;
     63     let source: &dyn EventSource = &transport;
     64     let subscriber: &dyn EventSubscriber = &transport;
     65     let sink: &dyn EventSink = &transport;
     66 
     67     let future = source.status();
     68     drop(future); // The composing host chooses and drives its async executor.
     69     let _ = subscriber;
     70     let future = sink.status();
     71     drop(future);
     72 }