pub mod api;
pub mod assets;
pub mod history;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BenchResult {
pub name: String,
#[serde(flatten)]
pub metrics: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestOutcome {
pub name: String,
pub passed: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration_ms: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BenchRun {
pub date: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(default)]
pub version: String,
#[serde(default)]
pub machine: String,
#[serde(default)]
pub cores: u32,
pub results: Vec<BenchResult>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tests: Vec<TestOutcome>,
}
impl BenchRun {
pub fn find(&self, name: &str) -> Option<&BenchResult> {
self.results.iter().find(|r| r.name == name)
}
pub fn all_tests_passed(&self) -> bool {
self.tests.iter().all(|t| t.passed)
}
pub fn failed_tests(&self) -> Vec<&str> {
self.tests
.iter()
.filter(|t| !t.passed)
.map(|t| t.name.as_str())
.collect()
}
}