coodev_runner/
lib.rs

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  // utils
13  get_workflow_event_payload,
14  should_skip_workflow,
15  // structs
16  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  /// refs/heads/master / refs/tags/v1.0.0 / refs/pull/1/merge
61  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  /// Trigger by API
70  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  /// Step log
102  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}