//! # Xactor is a rust actors framework based on async-std //! //! ## Documentation //! //! * [GitHub repository](https://github.com/sunli829/xactor) //! * [Cargo package](https://crates.io/crates/xactor) //! * Minimum supported Rust version: 1.39 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 xactor::*; //! //! #[message(result = "String")] //! struct ToUppercase(String); //! //! struct MyActor; //! //! impl Actor for MyActor {} //! //! #[async_trait::async_trait] //! impl Handler for MyActor { //! async fn handle(&mut self, _ctx: &mut Context, msg: ToUppercase) -> String { //! msg.0.to_uppercase() //! } //! } //! //! #[xactor::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(()) //! } //! ``` //! //! ## Performance //! //! **Actix vs. Xactor** //! //! | |Wait for response|Send only| //! |--------|-----------------|---------| //! |Actix | 1548 ms| 14 ms| //! |Xactor | 930 ms| 18 ms| //! //! [GitHub repository](https://github.com/sunli829/xactor-benchmarks) //! //! ## References //! //! * [Actix](https://github.com/actix/actix) //! * [Async-std](https://github.com/async-rs/async-std) #![allow(clippy::type_complexity)] mod actor; mod addr; mod broker; mod caller; mod context; mod runtime; mod service; mod supervisor; /// Alias of anyhow::Result pub type Result = anyhow::Result; /// Alias of anyhow::Error pub type Error = anyhow::Error; pub type ActorId = u64; pub use actor::{Actor, Handler, Message, StreamHandler}; pub use addr::{Addr, WeakAddr}; pub use broker::Broker; pub use caller::{Caller, Sender}; pub use context::Context; pub use runtime::{block_on, sleep, spawn, timeout}; pub use service::{LocalService, Service}; pub use supervisor::Supervisor; pub use xactor_derive::{main, message};