Expand description
acril-rt - a small single-threaded runtime for Acril
Features:
- Tiny - less than 500 lines of code
- Fast - runs on an efficient event loop powered by Tokio
- Safe -
#![forbid(unsafe_code)]
here and in Acril
Examples
use acril_rt::prelude::*;
struct Pinger {
count: u32,
}
struct Ping;
struct Pong(u32);
impl Service for Pinger {
type Context = Context<Self>;
type Error = ();
}
impl Handler<Ping> for Pinger {
type Response = Pong;
async fn call(&mut self, _ping: Ping, _cx: &mut Self::Context) -> Result<Pong, Self::Error> {
self.count += 1;
Ok(Pong(self.count))
}
}
struct GetCount;
impl Handler<GetCount> for Pinger {
type Response = u32;
async fn call(&mut self, _get_count: GetCount, _cx: &mut Self::Context) -> Result<u32, Self::Error> {
Ok(self.count)
}
}
#[tokio::main(flavor = "current_thread")]
async fn main() {
// make sure the runtime can spawn !Send tasks
let local_set = tokio::task::LocalSet::new();
let _guard = local_set.enter();
let runtime = Runtime::new();
local_set.run_until(async move {
let addr = runtime.spawn(Pinger { count: 0 }).await;
for i in 0..100 {
let pong = addr.send(Ping).await.unwrap();
assert_eq!(pong.0, i + 1);
}
assert_eq!(addr.send(GetCount).await.unwrap(), 100);
}).await
}
Modules
use acril_rt::prelude::*;
to import the commonly used types.
Structs
- A handle to a running
Service
, allowing to send messages to it. - An arbiter is a single-threaded event loop, allowing users to spawn tasks onto it.
- A handle to an arbiter, allowing to spawn futures onto the arbiter or stop it.
- A service context.
- The main component of
acril_rt
- the runtime. It stores the running services and handles their lifecycle and messages sent to them.
Enums
- An error returned while retrieving a singleton service.
Functions
- Require the iterator to have only one item, erroring if it has less than one or more than one. If there were more than one items, the next item is present as Err(Some(next_item))