use oneyaml_core::{Schema, Settings};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum ConflictSeverity {
Warning,
Error,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum Conflict {
Yaml11WithoutCore {
setting: &'static str,
schema: Schema,
},
HonorDirectiveWithoutCore {
schema: Schema,
},
HonorDirectiveRedundant,
ZeroIndent,
}
impl Conflict {
pub(crate) fn severity(self) -> ConflictSeverity {
match self {
Conflict::Yaml11WithoutCore { .. }
| Conflict::HonorDirectiveWithoutCore { .. }
| Conflict::HonorDirectiveRedundant => ConflictSeverity::Warning,
Conflict::ZeroIndent => ConflictSeverity::Error,
}
}
}
pub(crate) fn check_settings(settings: &Settings) -> Vec<Conflict> {
let mut out = Vec::new();
let schema = settings.get_schema();
let non_core = matches!(schema, Schema::Json | Schema::Failsafe);
let yaml11 = [
("yaml11_booleans", settings.get_yaml11_booleans()),
("legacy_octal", settings.get_legacy_octal()),
("sexagesimal", settings.get_sexagesimal()),
("digit_separators", settings.get_digit_separators()),
("yaml11_int_forms", settings.get_yaml11_int_forms()),
];
if non_core {
out.extend(
yaml11
.iter()
.filter(|(_, on)| *on)
.map(|(setting, _)| Conflict::Yaml11WithoutCore { setting, schema }),
);
}
if settings.get_honor_version_directive() {
let all_scalar = yaml11.iter().all(|(_, on)| *on);
if settings.get_merge_keys() && (non_core || all_scalar) {
out.push(if non_core {
Conflict::HonorDirectiveWithoutCore { schema }
} else {
Conflict::HonorDirectiveRedundant
});
}
}
if settings.get_emit().get_indent() == 0 {
out.push(Conflict::ZeroIndent);
}
out
}