Skip to main content

CoreSubject

Struct CoreSubject 

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

One subject subscribed to over Core NATS.

Core NATS delivers to whoever is subscribed at that moment and stores nothing, so the only setting it has is the queue group that load-balances a subject across several subscribers. Reading a stream instead is JetStreamSubject; reading many subjects at once is CoreWildcard.

The subject is one destination, so a delayed redelivery needs nothing from the mount site: the framework publishes its copy back to this very subject.

§Examples

use ruststream_nats::prelude::*;
use serde::Deserialize;

#[derive(Deserialize)]
struct Order {
    id: u64,
}

// Every replica joins `workers`, so each order reaches one of them.
#[subscriber(CoreSubject::new("orders.created").queue_group("workers"))]
async fn fulfil(order: &Order) -> HandlerOutcome {
    tracing::info!(order.id, "fulfilled");
    HandlerOutcome::ack()
}

#[ruststream::app]
fn app() -> impl App {
    RustStream::new(AppInfo::new("fulfillment", "0.1.0")).with_broker(
        NatsBroker::new("nats://localhost:4222"),
        |b| {
            b.include(fulfil);
        },
    )
}

A JetStream setting is not a method here, so asking for one does not compile:

ⓘ
use ruststream_nats::CoreSubject;

// `durable` names a JetStream consumer, and Core NATS has none.
let bad = CoreSubject::new("orders.created").durable("worker-1");

Implementations§

Source§

impl CoreSubject

Source

pub fn new(subject: impl Into<String>) -> Self

Subscribes to subject over Core NATS.

Source

pub fn queue_group(self, name: impl Into<String>) -> Self

Load-balances the subject across a queue group: the server hands each message to one member instead of all of them.

Trait Implementations§

Source§

impl Clone for CoreSubject

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 CoreSubject

Source§

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

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

impl Eq for CoreSubject

Source§

impl IntoSource for CoreSubject

A descriptor is already a source, so the macro-free constructor takes it as it stands: subscriber(JetStreamSubject::new("orders.*", "ORDERS"), body) names the same subscription the #[subscriber(..)] attribute does.

§Examples

use ruststream::schemars::JsonSchema;
use ruststream_nats::prelude::*;
use serde::Deserialize;

#[derive(Deserialize, JsonSchema)]
struct Order {
    id: u64,
}

struct Audit;

impl Handle<Order> for Audit {
    async fn handle(
        &self,
        order: &Order,
        _outs: &(),
        _ctx: &mut Context<'_>,
    ) -> Result<(), HandlerOutcome> {
        tracing::info!(order.id, "audited");
        Ok(())
    }
}

#[ruststream::app]
fn app() -> impl App {
    RustStream::new(AppInfo::new("audit", "0.1.0")).with_broker(
        NatsBroker::new("nats://localhost:4222"),
        |b| {
            let audited = CoreSubject::new("orders.created").queue_group("auditors");
            b.include(subscriber(audited, Audit).build());
        },
    )
}
Source§

type Source = CoreSubject

The source the constructor stores.
Source§

fn into_source(self) -> Self

Builds the source.
Source§

impl NatsSubscription for CoreSubject

Source§

fn ensure_subject(&self) -> Result<(), NatsError>

A wildcard belongs to CoreWildcard, so it is refused here rather than opened as a subscription this type promises to address.

The subject is a string the caller supplies, often from configuration, so the two forms cannot be told apart while the crate compiles. The subscription refuses to open instead, which is a service that does not start rather than one that starts and loses a delayed message.

Source§

fn subject(&self) -> &str

The subject pattern this subscription receives messages on.
Source§

impl PartialEq for CoreSubject

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl RedeliveryAddressed<ConnectedNatsBroker> for CoreSubject

The subject itself, so the answer needs no connection and the future is ready.

Source§

fn redelivery_address( &self, _connected: &ConnectedNatsBroker, ) -> impl Future<Output = Result<RedeliveryAddress, NatsError>> + Send

Where a publish reaches this subscription again. Read more
Source§

impl StructuralPartialEq for CoreSubject

Source§

impl SubscriptionSource<ConnectedNatsBroker> for CoreSubject

Source§

type Subscriber = NatsSubscriber

The subscriber type this source opens.
Source§

type Copies = AddressedCopies

Who publishes the copies this subscription’s retries are made of, and who names where they go: AddressedCopies, NamedCopies or BrokerMoves. Read more
Source§

fn name(&self) -> &str

The name (subject / channel) this subscription binds to. Read more
Source§

async fn subscribe( self, connected: &ConnectedNatsBroker, ) -> Result<Self::Subscriber, NatsError>

Opens the subscription against the connected broker. Called once at startup. Read more
Source§

fn operation_bindings(&self) -> Bindings

What this subscription adds to its receive operation in the document. Read more
Source§

fn declare_retry(self, declaration: &RetryDeclaration) -> Self
where Self: Sized,

Takes the registration’s retry declaration into the descriptor, before the subscription opens. Read more
Source§

fn declare_retry_on( &self, connected: &C, declaration: &RetryDeclaration, ) -> Result<(), DeclareRetryError>

Carries the registration’s declaration to the broker, at the same point and before the subscription opens. Read more
Source§

fn channel_bindings(&self) -> Bindings

What this subscription adds to its channel in the generated AsyncAPI document. Read more
Source§

fn message_bindings(&self) -> Bindings

What this subscription adds to the messages that arrive on it. 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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<T> PublishedThrough<DefaultSlot> for T

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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