pub struct MqttFilter { /* private fields */ }Expand description
A subscription descriptor for one MQTT topic filter, wildcards included.
One such subscription reads every topic its filter matches, so it addresses none of them: the
mount site names where a deferred retry copy goes. MqttTopic is the descriptor for a
subscription that names a single topic and answers for its own copies.
use ruststream_rumqttc::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Telemetry {
temperature: f64,
}
#[subscriber(MqttFilter::new("devices/+/telemetry").qos(Qos::AtLeastOnce).shared("workers"))]
async fn record(telemetry: &Telemetry, Ctx(topic): Ctx<DeliveryTopic>) -> HandlerOutcome {
tracing::info!(%topic, telemetry.temperature, "reading recorded");
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("fleet", "0.1.0")).with_broker(
MqttBroker::new("mqtt://localhost:1883", "fleet-svc"),
|b| {
// The filter names no single topic, so the mount site says where a retry copy goes.
b.include(record)
.out_retry(Publish::default())
.to("devices/retry/telemetry");
},
)
}A publish transform names the destination per delivery instead of once. Naming a topic with
.to(..) and composing a naming transform are mutually exclusive: writing both does not
compile.
use ruststream::runtime::{Names, Outgoing, PublishContext};
use ruststream_rumqttc::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Command {
action: String,
}
#[subscriber(MqttFilter::new("devices/+/commands").qos(Qos::AtLeastOnce))]
async fn execute(command: &Command, Ctx(topic): Ctx<DeliveryTopic>) -> HandlerOutcome {
tracing::info!(command.action, %topic, "running");
HandlerOutcome::ack()
}
/// Sends every copy back to the topic its own delivery arrived on, which is the one topic of
/// the filter's many that this message belongs to.
struct ToDeliveryTopic;
impl<Options> PublishTransform<ForReply<MqttContext>, Options> for ToDeliveryTopic {
type Destination = Names;
fn apply(
&self,
out: &mut Outgoing<'_>,
_options: &mut Option<Options>,
cx: &PublishContext<'_, MqttContext>,
) {
out.set_name(cx.context(DeliveryTopic).to_owned());
}
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("commands", "0.1.0")).with_broker(
MqttBroker::new("mqtt://localhost:1883", "commands-svc"),
|b| {
// A copy returns to the device it came from rather than to one topic for the fleet.
b.include(execute)
.max_attempts(nonzero!(5u32))
.dead_letter("dead/commands")
.out_retry(Publish::default())
.transform(ToDeliveryTopic);
},
)
}Implementations§
Source§impl MqttFilter
impl MqttFilter
Sourcepub fn new(filter: impl Into<String>) -> Self
pub fn new(filter: impl Into<String>) -> Self
Names the topic filter, with wildcards as the protocol defines them.
Sourcepub fn qos(self, qos: Qos) -> Self
pub fn qos(self, qos: Qos) -> Self
Sets the delivery quality of service. Defaults to Qos::AtLeastOnce.
Makes this an MQTT 5 shared subscription in group: the broker distributes matching
messages across the group’s consumers instead of fanning out to each.
Trait Implementations§
Source§impl Clone for MqttFilter
impl Clone for MqttFilter
Source§impl Debug for MqttFilter
impl Debug for MqttFilter
impl Eq for MqttFilter
Source§impl FromName for MqttFilter
A topic filter is all this descriptor needs to exist, so the mount site may supply it: a
definition written #[subscriber(MqttFilter)] takes its filter from name(..) there, and the
quality of service and share group stay the defaults.
impl FromName for MqttFilter
A topic filter is all this descriptor needs to exist, so the mount site may supply it: a
definition written #[subscriber(MqttFilter)] takes its filter from name(..) there, and the
quality of service and share group stay the defaults.
Source§impl PartialEq for MqttFilter
impl PartialEq for MqttFilter
impl StructuralPartialEq for MqttFilter
Source§impl SubscriptionSource<ConnectedMqttBroker> for MqttFilter
impl SubscriptionSource<ConnectedMqttBroker> for MqttFilter
Source§type Copies = NamedCopies
type Copies = NamedCopies
A filter matches many topics and is a topic itself only by accident, so the descriptor addresses no copy and the mount site names where one goes.
Source§async fn subscribe(
self,
connected: &ConnectedMqttBroker,
) -> Result<MqttSubscriber, MqttError>
async fn subscribe( self, connected: &ConnectedMqttBroker, ) -> Result<MqttSubscriber, MqttError>
The app’s subscription stays in the session when the service stops: its drop leaves the filter on the server.
Source§fn operation_bindings(&self) -> Bindings
fn operation_bindings(&self) -> Bindings
The quality of service this subscription receives at, which is the consumer’s own setting and belongs to the operation rather than the channel.
Source§fn message_bindings(&self) -> Bindings
fn message_bindings(&self) -> Bindings
The MQTT 5 properties every delivery on this subscription is mapped through.
Source§type Subscriber = MqttSubscriber
type Subscriber = MqttSubscriber
Source§fn declare_retry(self, declaration: &RetryDeclaration) -> Selfwhere
Self: Sized,
fn declare_retry(self, declaration: &RetryDeclaration) -> Selfwhere
Self: Sized,
Source§fn declare_retry_on(
&self,
connected: &C,
declaration: &RetryDeclaration,
) -> Result<(), DeclareRetryError>
fn declare_retry_on( &self, connected: &C, declaration: &RetryDeclaration, ) -> Result<(), DeclareRetryError>
Source§fn channel_bindings(&self) -> Bindings
fn channel_bindings(&self) -> Bindings
AsyncAPI document. Read moreAuto Trait Implementations§
impl Freeze for MqttFilter
impl RefUnwindSafe for MqttFilter
impl Send for MqttFilter
impl Sync for MqttFilter
impl Unpin for MqttFilter
impl UnsafeUnpin for MqttFilter
impl UnwindSafe for MqttFilter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more