Crates.io | actorlib |
lib.rs | actorlib |
version | 1.3.1 |
source | src |
created_at | 2023-08-20 06:11:59.353512 |
updated_at | 2024-01-19 06:33:08.698973 |
description | Indeed, an actor library, not a framework, written in Rust |
homepage | |
repository | https://github.com/evgenyigumnov/actor-lib |
max_upload_size | |
id | 949210 |
size | 28,058 |
Indeed, an actor library, not a framework, written in Rust
Cargo.toml
[dependencies]
actorlib = "1.3.1"
echo.rs
#[derive(Debug)]
pub struct Echo;
#[derive(Debug)]
pub enum Message {
Ping,
}
#[derive(Debug)]
pub enum Response {
Pong {counter: u32},
}
#[derive(Debug,Clone)]
pub struct State {
pub counter: u32,
}
#[derive(Debug, Error)]
pub enum EchoError {
#[error("unknown error")]
Unknown,
#[error("std::io::Error")]
StdErr(#[from] std::io::Error),
}
#[async_trait]
impl Handler<Echo, Message, State, Response, EchoError> for Echo {
async fn receive(&self, ctx: Arc<Context<Echo, Message, State, Response, EchoError>>) -> Result<Response, EchoError> {
match ctx.mgs {
Message::Ping => {
println!("Received Ping");
let mut state_lock = ctx.state.lock().await;
state_lock.counter += 1;
if state_lock.counter > 10 {
Err(EchoError::Unknown)
} else {
Ok(Response::Pong{counter: state_lock.counter})
}
}
}
}
}
main.rs
#[tokio::main]
async fn main() -> Result<(), EchoError> {
let state = State {
counter: 0,
};
let echo_ref = ActorRef::new("echo".to_string(), Echo{}, state, 100000).await?;
println!("Sent Ping");
echo_ref.send(Message::Ping).await?;
println!("Sent Ping and ask response");
let pong = echo_ref.ask(Message::Ping).await?;
println!("Got {:?}", pong);
_ = echo_ref.stop();
tokio::time::sleep(Duration::from_millis(1000)).await;
Ok(())
}
Example output:
Sent Ping
Sent Ping and ask response
Received Ping
Received Ping
Got Pong { counter: 2 }
Example sources: https://github.com/evgenyigumnov/actor-lib/tree/main/test