coap_client/backend/
mod.rs

1//! Backend module provides swappable CoAP client backends
2// https://github.com/ryankurte/rust-coap-client
3// Copyright 2021 ryan kurte <ryan@kurte.nz>
4
5use async_trait::async_trait;
6use coap_lite::Packet;
7use futures::{Future, Stream};
8
9use crate::RequestOptions;
10
11#[cfg(feature = "backend-tokio")]
12pub mod backend_tokio;
13
14#[cfg(feature = "backend-tokio")]
15pub use backend_tokio::{Tokio, TokioObserve};
16
17pub trait Observer<E>: Stream<Item = Result<Packet, E>> + Send {
18    /// Fetch the observer token
19    fn token(&self) -> u32;
20    /// Fetch the observer resource
21    fn resource(&self) -> &str;
22}
23
24/// Generic transport trait for implementing CoAP client backends
25#[async_trait]
26pub trait Backend<E>: Send {
27    type Observe: Observer<E>;
28
29    async fn request(&mut self, req: Packet, opts: RequestOptions) -> Result<Packet, E>;
30
31    async fn observe(&mut self, resource: String, opts: RequestOptions)
32        -> Result<Self::Observe, E>;
33
34    async fn unobserve(&mut self, o: Self::Observe) -> Result<(), E>;
35}