genserver: generate a server
genserver is tiny async actor framework, inspired by Elixir's
GenServer. With few lines code, we do
great things.
Check out the docs for more details.
Synopsis
First run:
$ cargo add genserver
Then try this code here in your crate (note the 2 features which need to be
enabled in main.rs
or lib.rs
for applications and libraries respectively):
#![feature(generic_associated_types, type_alias_impl_trait)]
use std::future::Future;
use genserver::{make_registry, GenServer};
struct MyServer {
registry: MyRegistry,
}
impl GenServer for MyServer {
type Message = String;
type Registry = MyRegistry;
type Response = String;
type CallResponse<'a> = impl Future<Output = Self::Response> + 'a;
type CastResponse<'a> = impl Future<Output = ()> + 'a;
fn new(registry: Self::Registry) -> Self {
Self { registry }
}
fn handle_call(&mut self, message: Self::Message) -> Self::CallResponse<'_> {
println!("handle_call received {}", message);
std::future::ready("returned from handle_call".into())
}
fn handle_cast(&mut self, message: Self::Message) -> Self::CastResponse<'_> {
println!("handle_cast received {}", message);
std::future::ready(())
}
}
#[make_registry{
myserver: MyServer
}]
struct MyRegistry;
tokio_test::block_on(async {
let registry = MyRegistry::start().await;
let response = registry
.call_myserver("calling myserver".into())
.await
.unwrap();
registry
.cast_myserver("casting to myserver".into())
.await
.unwrap();
});