# Hannibal [![build](https://img.shields.io/github/actions/workflow/status/hoodie/hannibal/ci_cd.yml?branch=main)](https://github.com/hoodie/hannibal/actions?query=workflow%3A"\"Build") [![version](https://img.shields.io/crates/v/hannibal)](https://crates.io/crates/hannibal/) [![downloads](https://img.shields.io/crates/d/hannibal.svg?style=flat-square)](https://crates.io/crates/hannibal) [![docs.rs docs](https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square)](https://docs.rs/hannibal) [![contributors](https://img.shields.io/github/contributors/hoodie/notify-rust)](https://github.com/hoodie/hannibal/graphs/contributors) ![maintenance](https://img.shields.io/maintenance/yes/2025) [![license](https://img.shields.io/crates/l/hannibal.svg?style=flat)](https://crates.io/crates/hannibal/) a small actor library
## Why Credit where credit is due: Hannibal is a fork of the excellent [Xactor](https://github.com/sunli829/xactor) which unfortunately received very little interest by its original maintainer recently. As of now there is no breaking change here, we could still merge xactor and hannibal again. Please reach out [via an issue](https://github.com/hoodie/hannibal/issues/new) if you are interested. ## Documentation - [GitHub repository](https://github.com/hoodie/hannibal) - [Cargo package](https://crates.io/crates/hannibal) - Minimum supported Rust version: 1.56 or later ## Features - Async actors. - Actor communication in a local context. - Using Futures for asynchronous message handling. - Typed messages (No `Any` type). Generic messages are allowed. ## Examples ```rust use hannibal::*; #[message(result = String)] struct ToUppercase(String); struct MyActor; impl Actor for MyActor {} impl Handler for MyActor { async fn handle(&mut self, _ctx: &mut Context, msg: ToUppercase) -> String { msg.0.to_uppercase() } } #[hannibal::main] async fn main() -> Result<()> { // Start actor and get its address let mut addr = MyActor.start().await?; // Send message `ToUppercase` to actor via addr let res = addr.call(ToUppercase("lowercase".to_string())).await?; assert_eq!(res, "LOWERCASE"); Ok(()) } ``` ## Installation Hannibal requires [async-trait](https://github.com/dtolnay/async-trait) on userland. With [cargo add][cargo-add] installed, run: ```sh $ cargo add hannibal $ cargo add async-trait ``` We also provide the [tokio](https://tokio.rs/) runtime instead of [async-std](https://async.rs/). To use it, you need to activate `runtime-tokio` and disable default features. You can edit your `Cargo.toml` as follows: ```toml hannibal = { version = "x.x.x", features = ["runtime-tokio"], default-features = false } ``` [cargo-add]: https://github.com/killercup/cargo-edit ## References - [Actix](https://github.com/actix/actix) - [Async-std](https://github.com/async-rs/async-std) - [Tokio](https://github.com/tokio-rs/tokio) - [Xactor](https://github.com/sunli829/xactor)