use serde::{Deserialize, Serialize};
use crate::detect::Detected;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct KnownIssue {
pub failure: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub runtime: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
pub url: String,
pub note: String,
}
#[derive(Debug, Default, Deserialize)]
#[serde(deny_unknown_fields)]
struct File {
#[serde(default)]
issue: Vec<KnownIssue>,
}
pub fn parse(text: &str) -> Result<Vec<KnownIssue>, String> {
toml::from_str::<File>(text)
.map(|f| f.issue)
.map_err(|e| e.to_string())
}
pub fn builtin() -> Vec<KnownIssue> {
parse(include_str!("../fixtures/known_issues.toml")).expect("built-in known_issues.toml parses")
}
pub fn matches(k: &KnownIssue, failure: &str, d: &Detected, model: &str) -> bool {
k.failure == failure
&& k.runtime.as_ref().is_none_or(|r| *r == d.runtime)
&& k.model
.as_ref()
.is_none_or(|m| model.to_ascii_lowercase().contains(&m.to_ascii_lowercase()))
}