Skip to main content

ephemeris_report/
details.rs

1use facet::Facet;
2
3use crate::Outcome;
4
5/// The structured result of a check, selected by `kind`.
6#[derive(Clone, Debug, Eq, Facet, PartialEq)]
7#[facet(tag = "kind", rename_all = "kebab-case")]
8#[repr(u8)]
9pub enum Details {
10    /// Test results.
11    Tests {
12        /// The counts per outcome.
13        summary: TestSummary,
14        /// Every test.
15        items: Vec<TestItem>,
16    },
17    /// Compiler or linter diagnostics.
18    Diagnostics {
19        /// The counts per level.
20        summary: DiagnosticSummary,
21        /// Every diagnostic.
22        items: Vec<Diagnostic>,
23    },
24    /// Formatting differences.
25    Diff {
26        /// One entry per changed file.
27        items: Vec<FileDiff>,
28    },
29}
30
31/// Test counts.
32#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
33pub struct TestSummary {
34    /// Tests that passed.
35    pub passed: u64,
36    /// Tests that failed.
37    pub failed: u64,
38    /// Tests that were skipped.
39    pub skipped: u64,
40}
41
42/// One test.
43#[derive(Clone, Debug, Eq, Facet, PartialEq)]
44pub struct TestItem {
45    /// The full test name.
46    pub name: String,
47    /// How the test ended.
48    pub outcome: Outcome,
49    /// The failure message, when there is one.
50    #[facet(default, skip_serializing_if = Option::is_none)]
51    pub message: Option<String>,
52}
53
54/// Diagnostic counts.
55#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
56pub struct DiagnosticSummary {
57    /// Diagnostics of level error.
58    pub errors: u64,
59    /// Diagnostics of level warning.
60    pub warnings: u64,
61}
62
63/// The severity of a diagnostic.
64#[derive(Clone, Copy, Debug, Eq, Facet, PartialEq)]
65#[facet(rename_all = "lowercase")]
66#[repr(u8)]
67pub enum Level {
68    /// The check cannot pass.
69    Error,
70    /// The check can pass but the code needs attention.
71    Warning,
72    /// Extra information.
73    Note,
74}
75
76/// One compiler or linter message.
77#[derive(Clone, Debug, Eq, Facet, PartialEq)]
78pub struct Diagnostic {
79    /// The severity.
80    pub level: Level,
81    /// The message text.
82    pub message: String,
83    /// The file the message points at, relative to the repository.
84    #[facet(default, skip_serializing_if = Option::is_none)]
85    pub file: Option<String>,
86    /// The one-based line.
87    #[facet(default, skip_serializing_if = Option::is_none)]
88    pub line: Option<u64>,
89    /// The one-based column.
90    #[facet(default, skip_serializing_if = Option::is_none)]
91    pub column: Option<u64>,
92    /// The lint or error code.
93    #[facet(default, skip_serializing_if = Option::is_none)]
94    pub code: Option<String>,
95}
96
97/// The difference a formatter would apply to one file.
98#[derive(Clone, Debug, Eq, Facet, PartialEq)]
99pub struct FileDiff {
100    /// The file, relative to the repository.
101    pub file: String,
102    /// The unified diff text.
103    pub text: String,
104}