astro_run/execution_context/
builder.rs

1use 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}