use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct ExperimentalFixes {
#[serde(default)]
pub bracket_name_stripping: bool,
#[serde(default)]
pub genus_rank_filtering: bool,
#[serde(default)]
pub multimatch_candidate_ranking: bool,
}
impl ExperimentalFixes {
pub fn all_enabled(&self) -> bool {
self.bracket_name_stripping
&& self.genus_rank_filtering
&& self.multimatch_candidate_ranking
}
pub fn any_enabled(&self) -> bool {
self.bracket_name_stripping
|| self.genus_rank_filtering
|| self.multimatch_candidate_ranking
}
pub fn summary(&self) -> String {
let mut enabled = vec![];
if self.bracket_name_stripping {
enabled.push("bracket_name_stripping");
}
if self.genus_rank_filtering {
enabled.push("genus_rank_filtering");
}
if self.multimatch_candidate_ranking {
enabled.push("multimatch_candidate_ranking");
}
if enabled.is_empty() {
"No experimental fixes enabled".to_string()
} else {
format!("Experimental fixes enabled: {}", enabled.join(", "))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_all_disabled_by_default() {
let gates = ExperimentalFixes::default();
assert!(!gates.bracket_name_stripping);
assert!(!gates.genus_rank_filtering);
assert!(!gates.multimatch_candidate_ranking);
}
#[test]
fn test_all_enabled() {
let gates = ExperimentalFixes {
bracket_name_stripping: true,
genus_rank_filtering: true,
multimatch_candidate_ranking: true,
};
assert!(gates.all_enabled());
assert!(gates.any_enabled());
}
#[test]
fn test_partially_enabled() {
let gates = ExperimentalFixes {
bracket_name_stripping: true,
genus_rank_filtering: false,
multimatch_candidate_ranking: false,
};
assert!(!gates.all_enabled());
assert!(gates.any_enabled());
}
#[test]
fn test_summary() {
let gates = ExperimentalFixes {
bracket_name_stripping: true,
genus_rank_filtering: false,
multimatch_candidate_ranking: true,
};
let summary = gates.summary();
assert!(summary.contains("bracket_name_stripping"));
assert!(summary.contains("multimatch_candidate_ranking"));
assert!(!summary.contains("genus_rank_filtering"));
}
}