1use std::collections::BTreeMap;
5
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub struct Outcome {
12 pub conclusion: Conclusion,
14 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub failure: Option<FailureDetail>,
17}
18
19#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "snake_case")]
22pub enum Conclusion {
23 #[default]
25 Success,
26 Failure,
28 Cancelled,
30 Skipped,
32 TimedOut,
34 InfraError,
36}
37
38#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(rename_all = "snake_case")]
41pub struct FailureDetail {
42 pub class: FailureClass,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
46 pub subclass: Option<String>,
47 #[serde(default, skip_serializing_if = "Option::is_none")]
49 pub failing_step: Option<String>,
50 pub excerpt: String,
52 pub excerpt_encoding: String,
54}
55
56#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "snake_case")]
59pub enum FailureClass {
60 #[default]
62 Build,
63 Test,
65 Lint,
67 Bench,
69 Infra,
71 Timeout,
73 MergeConflict,
75}
76
77#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
79#[serde(rename_all = "snake_case")]
80pub struct Execution {
81 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub pick_id: Option<String>,
84 pub attempt: u32,
86 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub runner: Option<String>,
89 pub started_at: String,
91 pub finished_at: String,
93 pub duration_ms: u64,
95 pub ran_suites: Vec<String>,
97 pub skipped_suites: Vec<String>,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub runner_pool: Option<String>,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
104 pub trust_tier: Option<String>,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub isolation_tier: Option<String>,
108 #[serde(default, skip_serializing_if = "Option::is_none")]
110 pub materialization_proof: Option<String>,
111 #[serde(default, skip_serializing_if = "Vec::is_empty")]
113 pub secret_grants: Vec<String>,
114}
115
116#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
118#[serde(rename_all = "snake_case")]
119pub struct LogRef {
120 pub manifest_digest: String,
122 pub size_bytes: u64,
124}
125
126#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
128#[serde(rename_all = "snake_case")]
129pub struct Repro {
130 pub command: Vec<String>,
132 pub env: BTreeMap<String, String>,
134 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub image: Option<String>,
137 pub services: Vec<String>,
139}