1use serde::{Deserialize, Serialize};
3
4use crate::schema::RunxSchema;
5use crate::{DoctorReport, JsonObject, JsonValue};
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
8pub enum DevReportSchema {
9 #[serde(rename = "runx.dev.v1")]
10 V1,
11}
12
13impl PartialEq<&str> for DevReportSchema {
14 fn eq(&self, other: &&str) -> bool {
15 matches!((self, *other), (Self::V1, "runx.dev.v1"))
16 }
17}
18
19#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
20#[serde(rename_all = "snake_case")]
21pub enum DevReportStatus {
22 Success,
23 Failure,
24 Skipped,
25 NeedsApproval,
26}
27
28#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
29#[serde(rename_all = "snake_case")]
30pub enum DevFixtureStatus {
31 Success,
32 Failure,
33 Skipped,
34}
35
36#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
37#[serde(rename_all = "snake_case")]
38pub enum DevFixtureAssertionKind {
39 SubsetMiss,
40 ExactMismatch,
41 PacketInvalid,
42 StatusMismatch,
43 TypeMismatch,
44}
45
46#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, RunxSchema)]
47#[serde(deny_unknown_fields)]
48pub struct DevFixtureAssertion {
49 pub path: String,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub expected: Option<JsonValue>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub actual: Option<JsonValue>,
54 pub kind: DevFixtureAssertionKind,
55 pub message: String,
56}
57
58#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, RunxSchema)]
59#[serde(deny_unknown_fields)]
60pub struct DevFixtureResult {
61 pub name: String,
62 pub lane: String,
63 pub target: JsonObject,
64 pub status: DevFixtureStatus,
65 pub duration_ms: u64,
66 pub assertions: Vec<DevFixtureAssertion>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub skip_reason: Option<String>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub output: Option<JsonValue>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub replay_path: Option<String>,
73}
74
75#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, RunxSchema)]
76#[serde(deny_unknown_fields)]
77#[runx_schema(id = "runx.dev.v1")]
78pub struct DevReport {
79 pub schema: DevReportSchema,
80 pub status: DevReportStatus,
81 pub doctor: DoctorReport,
82 pub fixtures: Vec<DevFixtureResult>,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub receipt_id: Option<String>,
85}