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 }