astro_run/execution_context/
builder.rs1use super::condition_matcher::ConditionMatcher;
2use crate::{
3 ContextPayload, ContextPayloadExt, Error, ExecutionContext, GithubAuthorization, Runner,
4 SharedPluginDriver, SignalManager, TriggerEvent,
5};
6use std::sync::Arc;
7
8#[derive(Default)]
9pub struct ExecutionContextBuilder {
10 runner: Option<Arc<Box<dyn Runner>>>,
11 plugin_driver: Option<SharedPluginDriver>,
12 signal_manager: Option<SignalManager>,
13 event: Option<TriggerEvent>,
14 github_auth: Option<GithubAuthorization>,
15 payload: Option<ContextPayload>,
16}
17
18impl ExecutionContextBuilder {
19 pub fn new() -> ExecutionContextBuilder {
20 ExecutionContextBuilder {
21 runner: None,
22 plugin_driver: None,
23 signal_manager: None,
24 event: None,
25 github_auth: None,
26 payload: None,
27 }
28 }
29
30 pub fn runner(mut self, runner: Arc<Box<dyn Runner>>) -> Self {
31 self.runner = Some(runner);
32 self
33 }
34
35 pub fn plugin_driver(mut self, plugin_driver: SharedPluginDriver) -> Self {
36 self.plugin_driver = Some(plugin_driver);
37
38 self
39 }
40
41 pub fn signal_manager(mut self, signal_manager: SignalManager) -> Self {
42 self.signal_manager = Some(signal_manager);
43 self
44 }
45
46 pub fn event(mut self, event: TriggerEvent) -> Self {
47 self.event = Some(event);
48 self
49 }
50
51 pub fn github_auth(mut self, github_auth: GithubAuthorization) -> Self {
52 self.github_auth = Some(github_auth);
53 self
54 }
55
56 pub fn payload<P>(mut self, payload: P) -> Self
57 where
58 P: ContextPayloadExt + 'static,
59 {
60 let payload = ContextPayload::new(payload);
61 self.payload = Some(payload);
62
63 self
64 }
65
66 pub fn build(self) -> ExecutionContext {
67 let runner = self
68 .runner
69 .ok_or(Error::init_error(
70 "Runner is not set in execution context builder",
71 ))
72 .unwrap();
73
74 let plugin_driver = self
75 .plugin_driver
76 .ok_or(Error::init_error(
77 "Plugin driver is not set in execution context builder",
78 ))
79 .unwrap();
80
81 let signal_manager = self
82 .signal_manager
83 .ok_or(Error::init_error(
84 "Signal manager is not set in execution context builder",
85 ))
86 .unwrap();
87
88 let payload = self.payload;
89
90 ExecutionContext {
91 runner,
92 signal_manager,
93 plugin_driver,
94 condition_matcher: ConditionMatcher::new(self.event, self.github_auth),
95 payload,
96 }
97 }
98}