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}