Skip to main content

executable_stories/
types.rs

1use serde::{Deserialize, Serialize};
2
3use crate::doc_entry::DocEntry;
4
5#[derive(Debug, Clone, Serialize)]
6pub struct Ticket {
7    pub id: String,
8    #[serde(skip_serializing_if = "Option::is_none")]
9    pub url: Option<String>,
10}
11
12#[derive(Serialize, Clone)]
13#[serde(rename_all = "camelCase")]
14pub struct RawRun {
15    pub schema_version: u32,
16    pub test_cases: Vec<RawTestCase>,
17    pub project_root: String,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub started_at_ms: Option<f64>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub finished_at_ms: Option<f64>,
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub ci: Option<RawCIInfo>,
24}
25
26#[derive(Serialize, Clone, Default)]
27#[serde(rename_all = "camelCase")]
28pub struct RawTestCase {
29    pub status: String,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub external_id: Option<String>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub title: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub story: Option<StoryMeta>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub duration_ms: Option<f64>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub error: Option<RawError>,
40    pub retry: i32,
41    pub retries: i32,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub attachments: Option<Vec<RawAttachment>>,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub step_events: Option<Vec<RawStepEvent>>,
46}
47
48#[derive(Serialize, Clone)]
49#[serde(rename_all = "camelCase")]
50pub struct StoryMeta {
51    pub scenario: String,
52    pub steps: Vec<StoryStep>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub tags: Option<Vec<String>>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub tickets: Option<Vec<Ticket>>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub meta: Option<serde_json::Value>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub docs: Option<Vec<DocEntry>>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub source_order: Option<u32>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub otel_spans: Option<Vec<serde_json::Value>>,
65}
66
67#[derive(Serialize, Clone)]
68#[serde(rename_all = "camelCase")]
69pub struct StoryStep {
70    pub keyword: String,
71    pub text: String,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub id: Option<String>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub mode: Option<String>,
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub wrapped: Option<bool>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub duration_ms: Option<f64>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub docs: Option<Vec<DocEntry>>,
82}
83
84#[derive(Serialize, Clone)]
85#[serde(rename_all = "camelCase")]
86pub struct RawError {
87    #[serde(skip_serializing_if = "Option::is_none")]
88    pub message: Option<String>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub stack: Option<String>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct RawAttachment {
96    pub name: String,
97    pub media_type: String,
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub path: Option<String>,
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub body: Option<String>,
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub encoding: Option<String>,
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub charset: Option<String>,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub file_name: Option<String>,
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub byte_length: Option<usize>,
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub step_index: Option<usize>,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub step_id: Option<String>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct RawStepEvent {
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub index: Option<usize>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub title: Option<String>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub status: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub duration_ms: Option<f64>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
130#[serde(rename_all = "camelCase")]
131pub struct RawCIInfo {
132    pub name: String,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub url: Option<String>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub build_number: Option<String>,
137}