pub struct Repository<Row>(/* private fields */);Expand description
The typed publish policy of a row with Publish: a message published through it becomes a
row of Row’s table.
It names its table at compile time, so a publish costs a static call; a row without Publish
does not compile as a policy.
§Examples
use ruststream::OutgoingMessage;
use ruststream::prelude::*;
use ruststream_sqlx::{Inbox, InboxQueue, Publish, Repository, SqlxBroker};
use serde::{Deserialize, Serialize};
use sqlx::{PgConnection, PgPool, Postgres};
#[derive(Inbox, sqlx::FromRow)]
#[inbox(table = "jobs")]
pub struct Job {
#[field(id, generated)]
id: i64,
#[field(group)]
name: String,
#[field(payload)]
payload: Vec<u8>,
}
impl Publish<Postgres> for Job {
async fn publish(
conn: &mut PgConnection,
message: &OutgoingMessage<'_>,
) -> Result<(), sqlx::Error> {
sqlx::query("INSERT INTO jobs (name, payload) VALUES ($1, $2)")
.bind(message.name())
.bind(message.payload())
.execute(conn)
.await?;
Ok(())
}
}
#[derive(Deserialize)]
struct Signup {
email: String,
}
#[derive(Serialize, Outgoing)]
#[outgoing(name = "welcome")]
struct Welcome {
email: String,
}
#[subscriber(InboxQueue::<Job>::new("signups"), reply)]
async fn greet(signup: &Signup) -> Welcome {
Welcome { email: signup.email.clone() }
}
pub fn app(pool: PgPool) -> RustStream {
RustStream::new(AppInfo::new("signup", "0.1.0")).with_broker(SqlxBroker::new(pool), |b| {
// The welcome becomes a row of `jobs` in group `welcome`, with no route to look up.
b.include(greet).out_reply(Repository::<Job>::default());
})
}Trait Implementations§
Source§impl<Row> Clone for Repository<Row>
impl<Row> Clone for Repository<Row>
impl<Row> Copy for Repository<Row>
Source§impl<Row> Debug for Repository<Row>
impl<Row> Debug for Repository<Row>
Source§impl<Row> Default for Repository<Row>
impl<Row> Default for Repository<Row>
Source§impl<DB, D, Row> PublishPolicy<ConnectedSqlxBroker<DB, D>> for Repository<Row>
impl<DB, D, Row> PublishPolicy<ConnectedSqlxBroker<DB, D>> for Repository<Row>
Source§type Live = RepositoryPublisher<DB, Row>
type Live = RepositoryPublisher<DB, Row>
The live form this policy pairs into: a
Publisher for a leaf policy, or the live
wiring form for a combinator stack (a typed publisher over a policy pairs into the same
typed publisher over the live leaf).Source§fn pair(
self,
connected: &ConnectedSqlxBroker<DB, D>,
) -> impl Future<Output = Result<Self::Live, PairError>> + Send
fn pair( self, connected: &ConnectedSqlxBroker<DB, D>, ) -> impl Future<Output = Result<Self::Live, PairError>> + Send
Pairs the policy with a connected broker, producing the live publisher. Read more
Source§fn channel_bindings(&self, channel: &str) -> Bindings
fn channel_bindings(&self, channel: &str) -> Bindings
What a publish through this policy adds to its channel in the generated
AsyncAPI
document. Read moreSource§fn operation_bindings(&self, channel: &str) -> Bindings
fn operation_bindings(&self, channel: &str) -> Bindings
What a publish through this policy adds to its
send operation in the document. Read moreAuto Trait Implementations§
impl<Row> Freeze for Repository<Row>
impl<Row> RefUnwindSafe for Repository<Row>
impl<Row> Send for Repository<Row>
impl<Row> Sync for Repository<Row>
impl<Row> Unpin for Repository<Row>
impl<Row> UnsafeUnpin for Repository<Row>
impl<Row> UnwindSafe for Repository<Row>
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
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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> ⓘ
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 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> ⓘ
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