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
#![deny(missing_docs)] #![allow(clippy::needless_doctest_main)] //! A simple, ergonomic, idiomatic, macro for generating the boilerplate to use rust futures tasks in a concurrent actor style. //! //! # Example //! //! ``` //! # use ghost_actor::example::MyError; //! # use ghost_actor::dependencies::futures::future::FutureExt; //! ghost_actor::ghost_actor! { //! name: pub MyActor, //! error: MyError, //! api: { //! AddOne::add_one( //! "A test function, output adds 1 to input.", //! u32, u32), //! } //! } //! //! /// An example implementation of the example MyActor GhostActor. //! struct MyActorImpl; //! //! impl MyActorHandler<(), ()> for MyActorImpl { //! fn handle_add_one( //! &mut self, //! input: u32, //! ) -> MyActorHandlerResult<u32> { //! Ok(async move { //! Ok(input + 1) //! }.boxed().into()) //! } //! } //! //! impl MyActorImpl { //! /// Rather than using ghost_actor_spawn directly, use this simple spawn. //! pub async fn spawn() -> MyActorSender<()> { //! use futures::future::FutureExt; //! //! let (sender, driver) = MyActorSender::ghost_actor_spawn(Box::new(|_| { //! async move { //! Ok(MyActorImpl) //! }.boxed().into() //! })).await.unwrap(); //! //! tokio::task::spawn(driver); //! //! sender //! } //! } //! //! async fn async_main() { //! let mut sender = MyActorImpl::spawn().await; //! //! assert_eq!(43, sender.add_one(42).await.unwrap()); //! //! sender.ghost_actor_shutdown().await.unwrap(); //! //! assert_eq!( //! "Err(GhostError(SendError(SendError { kind: Disconnected })))", //! &format!("{:?}", sender.add_one(42).await), //! ); //! } //! # pub fn main() { //! # tokio::runtime::Builder::new() //! # .threaded_scheduler() //! # .build().unwrap().block_on(async_main()); //! # } //! ``` /// re-exported dependencies to help with macro references pub mod dependencies { pub use futures; pub use must_future; pub use paste; pub use thiserror; pub use tracing; } mod types; pub use types::*; mod ghost_chan; pub use ghost_chan::*; mod macros; pub use macros::*; mod tests; pub use tests::*;