1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
//! # act-zero //! An actor system for Rust, designed with several goals in mind: //! - No boilerplate. //! - Ergonomic. //! - Supports standard trait-based static and dynamic polymorphism. //! - Embraces async/await. //! - Executor agnostic. //! //! Very little code is required to get started: //! //! ``` //! use std::error::Error; //! //! use futures::executor::LocalPool; //! use act_zero::*; //! //! struct SimpleGreeter { //! number_of_greets: i32, //! } //! //! impl Actor for SimpleGreeter {} //! //! impl SimpleGreeter { //! async fn greet(&mut self, name: String) -> ActorResult<String> { //! self.number_of_greets += 1; //! Produces::ok(format!( //! "Hello, {}. You are number {}!", //! name, self.number_of_greets //! )) //! } //! } //! //! fn main() -> Result<(), Box<dyn Error>> { //! let mut pool = LocalPool::new(); //! let spawner = pool.spawner(); //! pool.run_until(async move { //! let actor_ref = Addr::new( //! &spawner, //! SimpleGreeter { //! number_of_greets: 0, //! }, //! )?; //! //! let greeting = call!(actor_ref.greet("John".into())).await?; //! println!("{}", greeting); //! //! let greeting = call!(actor_ref.greet("Emma".into())).await?; //! println!("{}", greeting); //! Ok(()) //! }) //! } //! ``` //! //! For mixing traits and actors, it's recommended to use the `async_trait` crate //! to allow using async methods in traits. #![deny(missing_docs)] mod actor; mod addr; mod macros; pub mod runtimes; pub mod timer; mod utils; pub use actor::*; pub use addr::*; pub use macros::*; pub use utils::*; #[doc(hidden)] pub mod hidden { pub use futures::channel::oneshot; pub use futures::future::FutureExt; #[cfg(feature = "tracing")] pub use log::trace; #[cfg(not(feature = "tracing"))] #[doc(hidden)] #[macro_export] macro_rules! trace { // Strip out all uses of `trace!` ($($args:tt)*) => {}; } #[cfg(not(feature = "tracing"))] pub use trace; #[cfg(feature = "tracing")] pub fn type_name_of_val<T: ?Sized>(_val: &T) -> tynm::TypeName<'static> { tynm::TypeName::new::<&T>() } #[cfg(feature = "tracing")] pub fn type_name_of_addr<T: crate::AddrLike>(_val: &T) -> tynm::TypeName<'static> { tynm::TypeName::new::<&T::Actor>() } }