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
use actix::prelude::*;

struct RunOnce<F>
where
    F: FnOnce() + 'static,
{
    call: Option<F>,
}

impl<F> RunOnce<F>
where
    F: FnOnce() + 'static,
{
    fn new(call: F) -> Self {
        RunOnce { call: Some(call) }
    }
}

impl<F> Actor for RunOnce<F>
where
    F: FnOnce() + 'static,
{
    type Context = Context<Self>;

    fn started(&mut self, ctx: &mut <Self as Actor>::Context) {
        match self.call.take() {
            Some(call) => call(),
            None => (),
        }
        ctx.stop();
    }
}

pub fn run_once<F>(f: F)
where
    F: FnOnce() + 'static,
{
    RunOnce::new(f).start();
}