pub struct ServiceRegistry<Svc> { /* private fields */ }
Expand description
A registry system used for linking a service’s message handlers with the RPC system at runtime.
Since the RPC system cannot determine what message payload matches with which handler at compile time, it must dynamically link them at runtime.
Not registering a handler will cause the handler to not be triggered even if a valid message comes through.
use rkyv::{Archive, Deserialize, Serialize};
use datacake_rpc::{Handler, Request, RpcService, ServiceRegistry, Status, RpcClient, Channel};
use std::net::SocketAddr;
#[repr(C)]
#[derive(Serialize, Deserialize, Archive, Debug)]
#[archive(check_bytes)]
#[archive_attr(derive(Debug))]
pub struct MyMessage {
name: String,
age: u32,
}
#[repr(C)]
#[derive(Serialize, Deserialize, Archive, Debug)]
#[archive(check_bytes)]
#[archive_attr(derive(Debug))]
pub struct MyOtherMessage {
age: u32,
}
pub struct EchoService;
impl RpcService for EchoService {
fn register_handlers(registry: &mut ServiceRegistry<Self>) {
// Since we've registered the `MyMessage` handler, the RPC system
// will dispatch the messages to out handler.
//
// But because we *haven't* registered our `MyOtherMessage` handler,
// even though our service implements the handler, no messages will
// be dispatched.
registry.add_handler::<MyMessage>();
}
}
#[datacake_rpc::async_trait]
impl Handler<MyMessage> for EchoService {
type Reply = MyMessage;
async fn on_message(&self, msg: Request<MyMessage>) -> Result<Self::Reply, Status> {
Ok(msg.to_owned().unwrap())
}
}
#[datacake_rpc::async_trait]
impl Handler<MyOtherMessage> for EchoService {
type Reply = MyOtherMessage;
async fn on_message(&self, msg: Request<MyOtherMessage>) -> Result<Self::Reply, Status> {
Ok(msg.to_owned().unwrap())
}
}
Implementations§
Source§impl<Svc> ServiceRegistry<Svc>
impl<Svc> ServiceRegistry<Svc>
Sourcepub fn add_handler<Msg>(&mut self)
pub fn add_handler<Msg>(&mut self)
Adds a new handler to the registry.
This is done in the form of specifying what message types are handled by the service via the generic.
Auto Trait Implementations§
impl<Svc> Freeze for ServiceRegistry<Svc>
impl<Svc> !RefUnwindSafe for ServiceRegistry<Svc>
impl<Svc> Send for ServiceRegistry<Svc>
impl<Svc> Sync for ServiceRegistry<Svc>
impl<Svc> Unpin for ServiceRegistry<Svc>
impl<Svc> !UnwindSafe for ServiceRegistry<Svc>
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
The archived version of the pointer metadata for this type.
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Converts some archived metadata to the pointer metadata for itself.
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<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
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> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Gets the layout of the type.