use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CoverageDimension {
pub tag: String,
#[serde(default = "default_true")]
pub required: bool,
}
fn default_true() -> bool {
true
}
impl CoverageDimension {
pub fn required(tag: impl Into<String>) -> Self {
Self {
tag: tag.into(),
required: true,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CoverageSchema {
pub dimensions: Vec<CoverageDimension>,
}
impl Default for CoverageSchema {
fn default() -> Self {
Self {
dimensions: [
"purpose",
"constraints",
"success-criteria",
"scope",
"non-goals",
]
.iter()
.map(|t| CoverageDimension::required(*t))
.collect(),
}
}
}
impl CoverageSchema {
pub fn required_tags(&self) -> impl Iterator<Item = &str> {
self.dimensions
.iter()
.filter(|d| d.required)
.map(|d| d.tag.as_str())
}
}