30 releases

new 0.6.5 Dec 8, 2024
0.6.3 Oct 4, 2024
0.6.2 Jun 21, 2024
0.6.1 Feb 14, 2024
0.2.5 Sep 18, 2021

#309 in Asynchronous

Download history 17/week @ 2024-09-19 17/week @ 2024-09-26 166/week @ 2024-10-03 17/week @ 2024-10-10 5/week @ 2024-10-17 7/week @ 2024-10-31 4/week @ 2024-11-07 5/week @ 2024-11-14 5/week @ 2024-11-21 132/week @ 2024-11-28 152/week @ 2024-12-05

294 downloads per month

MIT license

99KB
1K SLoC

Apocalypse: Simple Actor framework for Rust.

Work in progress, unusable in its current state

Acopacypse is heavily based on my experience with the actix framework, but built straight over tokio in a fully asynchronous way, and also in a very simplified way.

Here is a simple example using the framework:

use apocalypse::{Hell, Demon};

// Human demon that echoes a message with its name
struct Human {
    name: String
}

// Demon implementation for the human
impl Demon for Human {
    type Input = String;
    type Output = String;
    async fn handle(&mut self, message: Self::Input) -> Self::Output {
        format!("Hey, {} here: {}", self.name, &message)
    }
}

#[tokio::main]
async fn main() {
    // We create one demon
    let carlos = Human{
        name: "Carlos".to_string()
    };

    // We create a hell for this
    let hell = Hell::new();
    let join_handle = {
        let (gate, jh) = match hell.ignite().await {
            Ok(v) => v,
            Err(e) => panic!("Could not light up hell, {}", e)
        };
        
        // We spawn the demon in the running hell through the gate
        let location = match gate.spawn(carlos).await {
            Ok(v) => v,
            Err(e) => panic!("Could not spawn the demon, {}", e)
        };
    
        tokio::spawn(async move {
            let m1 = gate.send(&location, "hello world".to_string()).await.unwrap();
            // We print the message just for show
            println!("{}", &m1);
            // And check that it is correct
            assert_eq!("Hey, Carlos here: hello world", &m1);
        });

        jh
    };

    // We wait for all messages to be processed.
    join_handle.await.unwrap();
}

Lockups

At the moment, each demon has their own thread to process requests, so the only way to cause a lockup is to create a ring of requests that starts in one demon, and ends in the same one. Avoid this situation at all costs.

Dependencies

~4–15MB
~196K SLoC