Expand description
§Gabriel2
Gabriel2: Indeed, an actor library, not a framework, written in Rust
§Features
- Async for sending messages
- Async for messages processing in actor
- Support messaging like send and forget
- Support messaging like send and wait response
- Mutable state of actor
- Self reference in actor from context
- Actor lifecycle (pre_start, pre_stop)
§Usage
Cargo.toml
[dependencies]
gabriel2 = "1.0.5"
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
§Contributing
I would love to see contributions from the community. If you experience bugs, feel free to open an issue. If you would like to implement a new feature or bug fix, please follow the steps:
- Contact with me via telegram @ievkz or discord @igumnovnsk
- Confirm e-mail invitation in repository
- Do “git clone”
- Create branch with your assigned issue
- Create pull request to main branch
Structs§
- The
ActorRef
struct represents a reference to an actor in the Actorlib framework. It contains the following fields: Context
is a structure that holds the context of an actor.
Traits§
Handler
is a trait that defines the behavior of an actor in the Actorlib framework.