Crates.io | acril-rt |
lib.rs | acril-rt |
version | 0.1.0 |
source | src |
created_at | 2024-01-06 16:50:30.422137 |
updated_at | 2024-01-06 16:50:30.422137 |
description | A lightweight single-threaded runtime for Acril actors. |
homepage | |
repository | https://github.com/nothendev/acril-rt |
max_upload_size | |
id | 1091062 |
size | 30,420 |
Features:
#![forbid(unsafe_code)]
here and in Acriluse 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
}