1mod actions;
2mod constants;
3mod error;
4mod runner;
5mod user_config;
6mod utils;
7
8pub use actions::{Action, ActionSteps, Actions};
9pub use error::*;
10pub use octocrate::{GithubWebhookPullRequestEvent, GithubWebhookPushEvent};
11pub use runner::{
12 get_workflow_event_payload,
14 should_skip_workflow,
15 CreateWorkflowOptions,
17 GithubAuthorization,
18 GlobalSecret,
19 GlobalVolume,
20 Job,
21 OrganizationSecret,
22 OrganizationVolume,
23 Plugin,
24 PluginManager,
25 RepositorySecret,
26 RepositoryVolume,
27 Runner,
28 RunnerBuilder,
29 Secret,
30 Step,
31 StepSecret,
32 StepVolume,
33 Volume,
34 Workflow,
35 WorkflowRefType,
36 WorkflowRunOptions,
37 WorkflowRunner,
38};
39use serde::{Deserialize, Serialize};
40use std::collections::HashMap;
41pub use user_config::{
42 EnvironmentVariable, UserActionStep, UserCommandStep, UserJob, UserStep, UserWorkflow,
43 WorkflowLabelEvent, WorkflowPullRequestEvent, WorkflowPushEvent, WorkflowTriggerEvents,
44};
45
46pub type Id = String;
47
48pub type StepNumber = u64;
49
50pub type JobId = Id;
51
52pub type Result<T> = std::result::Result<T, error::Error>;
53
54#[derive(Serialize, Deserialize, Debug, Clone)]
55pub struct WorkflowAPIEvent {
56 pub repo_owner: String,
57 pub repo_name: String,
58 pub pr_number: Option<u64>,
59 pub sha: String,
60 pub ref_name: String,
62}
63
64#[derive(Serialize, Deserialize, Debug, Clone)]
65#[serde(rename_all = "snake_case")]
66pub enum WorkflowEvent {
67 Push(GithubWebhookPushEvent),
68 PullRequest(GithubWebhookPullRequestEvent),
69 API(WorkflowAPIEvent),
71}
72
73#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
74#[serde(rename_all = "snake_case")]
75pub enum WorkflowLogType {
76 Error,
77 Log,
78}
79
80#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
81#[serde(rename_all = "snake_case")]
82pub enum WorkflowState {
83 Pending,
84 Queued,
85 InProgress,
86 Succeeded,
87 Failed,
88 Cancelled,
89 Skipped,
90}
91
92#[derive(Debug, Clone)]
93pub struct StepLog {
94 pub log_type: WorkflowLogType,
95 pub message: String,
96 pub time: chrono::DateTime<chrono::Utc>,
97}
98
99#[derive(Serialize, Deserialize, Debug, Clone)]
100pub enum WorkflowMessage {
101 Log {
103 workflow_run_id: Id,
104 job_id: String,
105 number: u64,
106 log_type: WorkflowLogType,
107 message: String,
108 time: chrono::DateTime<chrono::Utc>,
109 },
110 WorkflowStateUpdated {
111 id: Id,
112 state: WorkflowState,
113 },
114 JobStateUpdated {
115 workflow_run_id: Id,
116 job_id: String,
117 state: WorkflowState,
118 },
119 StepStateUpdated {
120 workflow_run_id: Id,
121 job_id: String,
122 number: u64,
123 state: WorkflowState,
124 },
125}
126
127#[derive(Debug)]
128pub struct StepRunResult {
129 pub error: Option<error::Error>,
130 pub state: WorkflowState,
131 pub started_at: Option<chrono::DateTime<chrono::Utc>>,
132 pub ended_at: Option<chrono::DateTime<chrono::Utc>>,
133}
134
135#[derive(Debug)]
136pub struct JobRunResult {
137 pub state: WorkflowState,
138 pub started_at: Option<chrono::DateTime<chrono::Utc>>,
139 pub ended_at: Option<chrono::DateTime<chrono::Utc>>,
140 pub steps: Vec<StepRunResult>,
141}
142
143#[derive(Debug)]
144pub struct WorkflowRunResult {
145 pub state: WorkflowState,
146 pub started_at: Option<chrono::DateTime<chrono::Utc>>,
147 pub ended_at: Option<chrono::DateTime<chrono::Utc>>,
148 pub jobs: HashMap<String, JobRunResult>,
149}
150
151impl ToString for WorkflowRefType {
152 fn to_string(&self) -> String {
153 match self {
154 WorkflowRefType::Branch => "branch",
155 WorkflowRefType::Tag => "tag",
156 }
157 .to_string()
158 }
159}
160
161impl From<String> for WorkflowRefType {
162 fn from(event: String) -> Self {
163 match event.as_str() {
164 "branch" => WorkflowRefType::Branch,
165 "tag" => WorkflowRefType::Tag,
166 _ => WorkflowRefType::Branch,
167 }
168 }
169}
170
171impl ToString for WorkflowState {
172 fn to_string(&self) -> String {
173 match self {
174 WorkflowState::Pending => "pending",
175 WorkflowState::Queued => "queued",
176 WorkflowState::InProgress => "in_progress",
177 WorkflowState::Succeeded => "succeeded",
178 WorkflowState::Failed => "failed",
179 WorkflowState::Cancelled => "cancelled",
180 WorkflowState::Skipped => "skipped",
181 }
182 .to_string()
183 }
184}
185
186impl From<String> for WorkflowState {
187 fn from(event: String) -> Self {
188 match event.as_str() {
189 "pending" => WorkflowState::Pending,
190 "queued" => WorkflowState::Queued,
191 "in_progress" => WorkflowState::InProgress,
192 "succeeded" => WorkflowState::Succeeded,
193 "failed" => WorkflowState::Failed,
194 "cancelled" => WorkflowState::Cancelled,
195 "skipped" => WorkflowState::Skipped,
196 _ => WorkflowState::Pending,
197 }
198 }
199}
200
201impl WorkflowState {
202 pub fn is_completed(&self) -> bool {
203 match self {
204 WorkflowState::Succeeded => true,
205 WorkflowState::Failed => true,
206 WorkflowState::Cancelled => true,
207 WorkflowState::Skipped => true,
208 _ => false,
209 }
210 }
211}