loadmaster_probe/
known.rs1use serde::{Deserialize, Serialize};
5
6use crate::detect::Detected;
7
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(deny_unknown_fields)]
10pub struct KnownIssue {
11 pub failure: String,
13 #[serde(default, skip_serializing_if = "Option::is_none")]
15 pub runtime: Option<String>,
16 #[serde(default, skip_serializing_if = "Option::is_none")]
18 pub model: Option<String>,
19 pub url: String,
20 pub note: String,
21}
22
23#[derive(Debug, Default, Deserialize)]
24#[serde(deny_unknown_fields)]
25struct File {
26 #[serde(default)]
27 issue: Vec<KnownIssue>,
28}
29
30pub fn parse(text: &str) -> Result<Vec<KnownIssue>, String> {
31 toml::from_str::<File>(text)
32 .map(|f| f.issue)
33 .map_err(|e| e.to_string())
34}
35
36pub fn builtin() -> Vec<KnownIssue> {
38 parse(include_str!("../fixtures/known_issues.toml")).expect("built-in known_issues.toml parses")
39}
40
41pub fn matches(k: &KnownIssue, failure: &str, d: &Detected, model: &str) -> bool {
42 k.failure == failure
43 && k.runtime.as_ref().is_none_or(|r| *r == d.runtime)
44 && k.model
45 .as_ref()
46 .is_none_or(|m| model.to_ascii_lowercase().contains(&m.to_ascii_lowercase()))
47}