ctrf_rs/insights/
run_insights.rs1use super::metric_delta::MetricDelta;
3
4use crate::impl_extra;
6
7use std::{collections::HashMap, time::Duration};
9
10use serde::{Deserialize, Serialize};
12use serde_json::Value;
13
14#[derive(Serialize, Deserialize, Default, Debug, PartialEq)]
17#[serde(rename_all = "camelCase")]
18pub struct RunInsights {
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub pass_rate: Option<MetricDelta<f64>>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub fail_rate: Option<MetricDelta<f64>>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub flaky_rate: Option<MetricDelta<f64>>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub average_run_duration: Option<MetricDelta<Duration>>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub p95_run_duration: Option<MetricDelta<Duration>>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub average_test_duration: Option<MetricDelta<Duration>>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub runs_analyzed: Option<usize>,
33 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
34 extra: HashMap<String, Value>,
35}
36
37impl RunInsights {
38 pub fn new() -> Self {
40 Self::default()
41 }
42}
43
44impl_extra!(RunInsights);