Skip to main content

fui/
worker_job.rs

1use crate::worker_runtime::WorkerRuntime;
2
3#[derive(Default)]
4pub struct WorkerJobState {
5    started: bool,
6    finished: bool,
7}
8
9impl WorkerJobState {
10    pub const fn new() -> Self {
11        Self {
12            started: false,
13            finished: false,
14        }
15    }
16}
17
18pub trait WorkerJob {
19    fn state(&mut self) -> &mut WorkerJobState;
20
21    fn on_start(&mut self, _input: String) {}
22
23    fn run(&mut self);
24
25    fn resume(&mut self, input: String) -> bool {
26        let should_start = {
27            let state = self.state();
28            if state.started {
29                false
30            } else {
31                state.started = true;
32                true
33            }
34        };
35        if should_start {
36            self.on_start(input);
37        }
38        if self.state().finished {
39            return false;
40        }
41        self.run();
42        !self.state().finished
43    }
44
45    fn report_progress(&mut self, progress: impl AsRef<str>) {
46        if self.state().finished {
47            return;
48        }
49        WorkerRuntime::report_progress(progress);
50    }
51
52    fn complete(&mut self, result: impl AsRef<str>) {
53        if self.state().finished {
54            return;
55        }
56        self.state().finished = true;
57        WorkerRuntime::complete(result);
58    }
59
60    fn fail(&mut self, message: impl AsRef<str>) {
61        if self.state().finished {
62            return;
63        }
64        self.state().finished = true;
65        WorkerRuntime::fail(message);
66    }
67
68    fn is_cancelled(&self) -> bool {
69        WorkerRuntime::is_cancelled()
70    }
71
72    fn r#yield(&mut self, delay_ms: i32) -> bool {
73        if self.state().finished {
74            return false;
75        }
76        WorkerRuntime::r#yield(delay_ms)
77    }
78
79    fn yield_now(&mut self, delay_ms: i32) -> bool {
80        self.r#yield(delay_ms)
81    }
82}