Skip to main content

runx_contracts/
dev.rs

1//! Dev-loop report contracts.
2use 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}