Crates.io | overclock |
lib.rs | overclock |
version | 0.1.13 |
source | src |
created_at | 2020-08-12 01:21:54.21399 |
updated_at | 2023-05-04 19:55:58.436371 |
description | A framework for building data-driven distributed systems |
homepage | https://www.overclock.rs |
repository | https://github.com/louaykamel/overclock |
max_upload_size | |
id | 275638 |
size | 370,676 |
Overclock is an actor model framework inspired by Elixir, enforces supervision tree and interoperability.
Add overclock to your Cargo.toml:
[dependencies]
overclock = "0.1"
use overclock::core::*;
// Define your actor struct
#[derive(Debug, Serialize, Deserialize, PartialEq, Default)]
struct HelloWorld;
#[async_trait::async_trait]
impl<S> Actor<S> for HelloWorld
where
S: SupHandle<Self>,
{
// Temporary state or resources during the actor lifecycle
type Data = usize;
// Interval channel which will yield Instant every 1000ms;
type Channel = IntervalChannel<1000>;
async fn init(&mut self, rt: &mut Rt<Self, S>) -> ActorResult<Self::Data> {
log::info!("HelloWorld: {}", rt.service().status());
let counter = 0;
Ok(counter)
}
async fn run(&mut self, rt: &mut Rt<Self, S>, mut counter: Self::Data) -> ActorResult<()> {
log::info!("HelloWorld: {}", rt.service().status());
while let Some(event) = rt.inbox_mut().next().await {
if counter == 3 {
counter += 1;
log::info!("HelloWorld: Received instant {:?}, counter: {}", event, counter);
} else {
break
}
}
log::info!("HelloWorld: exited its event loop");
Ok(())
}
}
#[tokio::main]
async fn main() {
let runtime = Runtime::from_config::<HelloWorld>().await.expect("Runtime to run");
runtime.block_on().await.expect("Runtime to shutdown gracefully");
}
cargo run --features="ron_config"
All contributions are welcome!
This project is licensed under either of
Copyright (C) 2022 Louay Kamel
Copyright (C) 2021 IOTA Stiftung