executable_stories/
types.rs1use 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}