pub struct CheckResult {
pub name: String,
pub verdict: Verdict,
pub severity: Option<Severity>,
pub detail: Option<String>,
pub at: DateTime<Utc>,
pub duration_ms: Option<u64>,
pub tags: Vec<String>,
pub evidence: Vec<Evidence>,
}Expand description
Result of a single check.
§Example
use dev_report::{CheckResult, Severity, Verdict};
let c = CheckResult::fail("unit::math", Severity::Error)
.with_detail("expected 42, got 41")
.with_duration_ms(7);
assert_eq!(c.verdict, Verdict::Fail);Fields§
§name: StringStable identifier for the check (e.g. compile, test::round_trip).
verdict: VerdictOutcome of the check.
severity: Option<Severity>Severity when the verdict is Fail or Warn. None for Pass and Skip.
detail: Option<String>Human-readable detail. Optional.
at: DateTime<Utc>Time the check ran. UTC.
duration_ms: Option<u64>Duration of the check, in milliseconds. Optional.
Free-form tags for filtering (e.g. "slow", "flaky", "bench").
Defaults to empty. v0.1.0 reports deserialize cleanly with no tags.
evidence: Vec<Evidence>Structured evidence backing this check.
Defaults to empty. v0.1.0 reports deserialize cleanly with no evidence.
Implementations§
Source§impl CheckResult
impl CheckResult
Sourcepub fn pass(name: impl Into<String>) -> Self
pub fn pass(name: impl Into<String>) -> Self
Build a passing check result with the given name.
§Example
use dev_report::{CheckResult, Verdict};
let c = CheckResult::pass("compile");
assert_eq!(c.verdict, Verdict::Pass);
assert!(c.severity.is_none());Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn fail(name: impl Into<String>, severity: Severity) -> Self
pub fn fail(name: impl Into<String>, severity: Severity) -> Self
Build a failing check result with the given name and severity.
§Example
use dev_report::{CheckResult, Severity, Verdict};
let c = CheckResult::fail("test::round_trip", Severity::Error);
assert_eq!(c.verdict, Verdict::Fail);
assert_eq!(c.severity, Some(Severity::Error));Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn warn(name: impl Into<String>, severity: Severity) -> Self
pub fn warn(name: impl Into<String>, severity: Severity) -> Self
Build a warning check result with the given name and severity.
§Example
use dev_report::{CheckResult, Severity, Verdict};
let c = CheckResult::warn("flaky", Severity::Warning);
assert_eq!(c.verdict, Verdict::Warn);Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn skip(name: impl Into<String>) -> Self
pub fn skip(name: impl Into<String>) -> Self
Build a skipped check result with the given name.
§Example
use dev_report::{CheckResult, Verdict};
let c = CheckResult::skip("not_applicable");
assert_eq!(c.verdict, Verdict::Skip);Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn with_detail(self, detail: impl Into<String>) -> Self
pub fn with_detail(self, detail: impl Into<String>) -> Self
Attach a human-readable detail to this check result.
§Example
use dev_report::CheckResult;
let c = CheckResult::pass("a").with_detail("ran in single thread");
assert_eq!(c.detail.as_deref(), Some("ran in single thread"));Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn with_duration_ms(self, ms: u64) -> Self
pub fn with_duration_ms(self, ms: u64) -> Self
Attach a duration measurement (milliseconds) to this check result.
§Example
use dev_report::CheckResult;
let c = CheckResult::pass("a").with_duration_ms(42);
assert_eq!(c.duration_ms, Some(42));Examples found in repository?
16fn main() {
17 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
18
19 r.push(CheckResult::pass("compile").with_duration_ms(120));
20 r.push(CheckResult::pass("test::math").with_duration_ms(7));
21
22 r.push(
23 CheckResult::fail("test::round_trip", Severity::Error)
24 .with_duration_ms(13)
25 .with_detail("expected 42, got 41"),
26 );
27
28 r.push(
29 CheckResult::fail("integration::startup", Severity::Critical)
30 .with_detail("service refused to start"),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.push(CheckResult::skip("integration::network").with_detail("no network in sandbox"));
39
40 r.finish();
41
42 println!("{}", r.to_junit_xml());
43}More examples
21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn with_severity(self, severity: Severity) -> Self
pub fn with_severity(self, severity: Severity) -> Self
Override the severity of this check result.
Useful when escalating or de-escalating a check after construction
(e.g. promote a Warn+Warning to Warn+Error based on a config flag).
§Example
use dev_report::{CheckResult, Severity};
let c = CheckResult::warn("flaky", Severity::Warning)
.with_severity(Severity::Error);
assert_eq!(c.severity, Some(Severity::Error));Sourcepub fn with_tag(self, tag: impl Into<String>) -> Self
pub fn with_tag(self, tag: impl Into<String>) -> Self
Attach a single tag to this check result.
§Example
use dev_report::CheckResult;
let c = CheckResult::pass("compile").with_tag("slow");
assert!(c.has_tag("slow"));Examples found in repository?
21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Attach many tags at once from any iterable of strings.
§Example
use dev_report::CheckResult;
let c = CheckResult::pass("compile").with_tags(["slow", "flaky"]);
assert!(c.has_tag("flaky"));Examples found in repository?
21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn has_tag(&self, tag: &str) -> bool
pub fn has_tag(&self, tag: &str) -> bool
Return true if this check has the given tag.
§Example
use dev_report::CheckResult;
let c = CheckResult::pass("compile").with_tag("slow");
assert!(c.has_tag("slow"));
assert!(!c.has_tag("flaky"));Sourcepub fn with_evidence(self, e: Evidence) -> Self
pub fn with_evidence(self, e: Evidence) -> Self
Attach a single piece of Evidence to this check result.
§Example
use dev_report::{CheckResult, Evidence};
let c = CheckResult::pass("bench")
.with_evidence(Evidence::numeric("mean_ns", 1234.0));
assert_eq!(c.evidence.len(), 1);Examples found in repository?
15fn main() {
16 let mut r = Report::new("sample-subject", "0.9.3").with_producer("dev-bench");
17
18 r.push(CheckResult::pass("compile"));
19 r.push(CheckResult::skip("network"));
20
21 r.push(
22 CheckResult::fail("test::round_trip", Severity::Error)
23 .with_detail("expected 42, got 41")
24 .with_evidence(Evidence::file_ref_lines("site", "src/math.rs", 10, 12)),
25 );
26
27 r.push(
28 CheckResult::fail("integration::startup", Severity::Critical)
29 .with_detail("service refused to start")
30 .with_evidence(Evidence::file_ref("source", "src/bin/server.rs")),
31 );
32
33 r.push(
34 CheckResult::warn("style::trailing_ws", Severity::Warning)
35 .with_detail("3 trailing-whitespace warnings"),
36 );
37
38 r.finish();
39
40 println!("{}", r.to_sarif());
41}More examples
21fn build_report(producer: &str) -> Report {
22 let frozen_start = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 0).unwrap();
23 let frozen_end = chrono::Utc.with_ymd_and_hms(2026, 5, 11, 12, 0, 5).unwrap();
24
25 let mut r = Report::new("sample-subject", "0.9.3").with_producer(producer);
26 r.set_started_at(frozen_start);
27
28 // Pass with no detail, no severity, no tags, no evidence.
29 let mut c1 = CheckResult::pass("compile");
30 c1.at = frozen_start;
31 r.push(c1);
32
33 // Pass with a duration and a single numeric evidence.
34 let mut c2 = CheckResult::pass("bench::parse")
35 .with_duration_ms(7)
36 .with_tag("bench")
37 .with_evidence(Evidence::numeric("mean_ns", 1234.5))
38 .with_evidence(Evidence::numeric_int("iterations", 1_000_000));
39 c2.at = frozen_start;
40 r.push(c2);
41
42 // Warn with key-value evidence.
43 let mut c3 = CheckResult::warn("env::leaked", Severity::Warning)
44 .with_detail("RUST_LOG was set during test")
45 .with_evidence(Evidence::kv("env", [("CI", "true"), ("RUST_LOG", "debug")]));
46 c3.at = frozen_start;
47 r.push(c3);
48
49 // Fail with snippet + file_ref (no line range) + file_ref (with line range).
50 let mut c4 = CheckResult::fail("test::round_trip", Severity::Error)
51 .with_detail("expected 42, got 41")
52 .with_duration_ms(13)
53 .with_tags(["unit", "flaky"])
54 .with_evidence(Evidence::snippet(
55 "panic",
56 "assertion `left == right` failed",
57 ))
58 .with_evidence(Evidence::file_ref("source", "src/math.rs"))
59 .with_evidence(Evidence::file_ref_lines(
60 "call_site",
61 "tests/smoke.rs",
62 42,
63 47,
64 ));
65 c4.at = frozen_start;
66 r.push(c4);
67
68 // Fail with Critical severity.
69 let mut c5 = CheckResult::fail("integration::startup", Severity::Critical)
70 .with_detail("service refused to start");
71 c5.at = frozen_start;
72 r.push(c5);
73
74 // Warn with Info severity (lowest severity, still warn verdict).
75 let mut c6 = CheckResult::warn("style::trailing_ws", Severity::Info)
76 .with_detail("3 trailing-whitespace warnings");
77 c6.at = frozen_start;
78 r.push(c6);
79
80 // Skip with no severity.
81 let mut c7 = CheckResult::skip("integration::network").with_detail("no network in sandbox");
82 c7.at = frozen_start;
83 r.push(c7);
84
85 // Manually-constructed FileRef via Evidence::file_ref (covered above);
86 // also exercise a standalone FileRef with line_start but no line_end —
87 // valid per the schema (both are optional independently).
88 let mut c8 = CheckResult::pass("doc::link_check");
89 c8.at = frozen_start;
90 let standalone = FileRef::new("docs/index.md").with_line_range(10, 10);
91 c8 = c8.with_evidence(Evidence {
92 label: "anchor".into(),
93 data: dev_report::EvidenceData::FileRef(standalone),
94 });
95 r.push(c8);
96
97 r.set_finished_at(Some(frozen_end));
98 r
99}Sourcepub fn with_evidences<I>(self, items: I) -> Selfwhere
I: IntoIterator<Item = Evidence>,
pub fn with_evidences<I>(self, items: I) -> Selfwhere
I: IntoIterator<Item = Evidence>,
Trait Implementations§
Source§impl Clone for CheckResult
impl Clone for CheckResult
Source§fn clone(&self) -> CheckResult
fn clone(&self) -> CheckResult
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more