Skip to main content

MqttPublisher

Struct MqttPublisher 

Source
pub struct MqttPublisher { /* private fields */ }
Expand description

Publishes messages to MQTT topics through the shared connection.

The publish is queued into the client session, so Ok means “owned by the session”, not “broker confirmed”. For QoS 1/2 the client keeps the message until the broker acknowledges it, across reconnects: a resumed session retransmits it, and a new session sends it again, where it may arrive twice. Buildable before connect and usable until shutdown; afterwards every publish reports MqttError::NotConnected.

Headers are sent as MQTT 5 user properties, so non-Rust peers see plain MQTT messages. The content-type, reply-to and correlation-id headers take the matching first-class properties (content type, response topic, correlation data), in both directions, and a message with no headers carries no properties at all. A textual content type (application/json, any text/ subtype, any +json vendor type) sets the payload format indicator to 1, and every other one to 0. A header name or value that is not text an MQTT string carries refuses the publish with MqttError::Publish; the correlation data is binary on the wire and takes any bytes.

§Examples

Nothing writes the media type for a service: a reply, a deferred retry copy and a plain publish carry the headers something put on them. A service whose peers read the content type property sets it once at the mount site, through a publish transform over the position:

use ruststream::runtime::{Outgoing, Reads};
use ruststream_rumqttc::prelude::*;
use serde::{Deserialize, Serialize};

/// States the media type of every message this position sends, which is what fills the content
/// type property and decides the payload format indicator. It reads nothing about the delivery,
/// so it is generic over the position and mounts on any of them.
struct Json;

impl<K: ContextKind, Options> PublishTransform<K, Options> for Json {
    type Destination = Reads;

    fn apply(&self, out: &mut Outgoing<'_>, _options: &mut Option<Options>, _cx: &K::View<'_>) {
        out.headers_mut().insert("content-type", "application/json");
    }
}

#[derive(Deserialize)]
struct Telemetry {
    device: String,
    temperature: f64,
}

#[derive(Serialize, Outgoing)]
#[outgoing(name = "devices/state")]
struct DeviceState {
    device: String,
    hot: bool,
}

#[subscriber(MqttFilter::new("devices/+/telemetry"), reply)]
async fn track(telemetry: &Telemetry) -> DeviceState {
    DeviceState { device: telemetry.device.clone(), hot: telemetry.temperature > 30.0 }
}

#[ruststream::app]
fn app() -> impl App {
    RustStream::new(AppInfo::new("states", "0.1.0")).with_broker(
        MqttBroker::new("mqtt://localhost:1883", "states-svc"),
        |b| {
            // Every reply now carries the content type property and the payload format
            // indicator 1, so a peer reads the body as UTF-8 JSON.
            b.include(track)
                .out_reply(Publish::default())
                .transform(Json)
                .out_retry(Publish::default())
                .to("devices/retry/telemetry");
        },
    )
}

Trait Implementations§

Source§

impl Clone for MqttPublisher

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MqttPublisher

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Publisher for MqttPublisher

Source§

type Payload = Take

The client keeps the payload: a PUBLISH packet is queued into the session, which holds the Bytes until the broker acknowledges it.

Source§

type Error = MqttError

The error type returned by publish.
Source§

type Options = MqttPublishOptions

The broker’s per-message settings: a QoS, a priority, an ordering key, whatever this transport lets one message differ from the next in. Read more
Source§

async fn publish( &self, msg: OutgoingMessage<'_, BytesMut>, options: Option<&Self::Options>, ) -> Result<(), Self::Error>

Publishes a message to the broker, with the per-message settings the call site adjusted. Read more
Source§

fn base_headers(&self) -> Option<&HeaderMap>

The headers this publisher contributes to every message it sends, underneath whatever the message itself names. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<P> PublishExt for P
where P: Publisher + ?Sized,

Source§

fn message<'a, T>( &'a self, value: &'a T, ) -> PublishBuilder<&'a Self, MessageBody<'a, T>, UnnamedCodec, HeadersUnset, <T as OutgoingDestination>::Form>

Starts a typed publish of a #[derive(Outgoing)] value, encoded with the crate’s default codec (name another one with with_codec(..)). A Serialized value’s bytes leave as they are instead - the wire is the type’s own (MessageWire), and no codec runs on it. Read more
Source§

fn begin( &self, ) -> impl Future<Output = Result<TransactionScope<'_, Self, UnnamedCodec, AnyDeclared>, Self::Error>> + Send

Opens a broker transaction on this publisher and returns the TransactionScope that owns it. Read more
Source§

fn owned_transaction( &self, ) -> impl Future<Output = Result<TypedTransaction<Self::Transaction, UnnamedCodec, AnyDeclared>, Self::Error>> + Send
where Self: Sized + OwnedTransactions,

Opens an owned broker transaction and returns the TypedTransaction that owns it. Read more
Source§

impl<T> PublishedThrough<DefaultSlot> for T

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more