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.
pub use *;
pub use *;
pub use *;
pub use *;