use bevy_ecs::resource::Resource;
use brink_compiler::AnalysisOptions;
use brink_project_config::ProjectConfig;
#[derive(Resource, Debug, Clone, Default, PartialEq, Eq)]
pub struct BrinkConfigWarnings(pub Vec<String>);
impl BrinkConfigWarnings {
pub(crate) fn from_config(config: Option<&ProjectConfig>) -> Self {
let config = config.cloned().unwrap_or_default();
let mut options = AnalysisOptions::default();
let warnings = options.apply_lint_overrides(&config.lints, config.deny_warnings);
Self(
warnings
.into_iter()
.map(|warning| warning.to_string())
.collect(),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_config_yields_no_warnings() {
assert_eq!(
BrinkConfigWarnings::from_config(None),
BrinkConfigWarnings::default()
);
}
#[test]
fn valid_lint_code_yields_no_warnings() {
let mut lints = std::collections::BTreeMap::new();
lints.insert("E014".to_owned(), brink_project_config::LintLevel::Deny);
let config = ProjectConfig {
lints,
..ProjectConfig::default()
};
assert_eq!(
BrinkConfigWarnings::from_config(Some(&config)),
BrinkConfigWarnings::default()
);
}
#[test]
fn unknown_code_surfaces_a_message_naming_it() {
let mut lints = std::collections::BTreeMap::new();
lints.insert(
"E9999_TYPO".to_owned(),
brink_project_config::LintLevel::Deny,
);
let config = ProjectConfig {
lints,
..ProjectConfig::default()
};
let warnings = BrinkConfigWarnings::from_config(Some(&config));
assert_eq!(warnings.0.len(), 1);
assert!(
warnings.0[0].contains("E9999_TYPO") && warnings.0[0].contains("not a recognized"),
"unexpected message: {warnings:?}"
);
}
#[test]
fn non_overridable_code_surfaces_a_message_naming_it() {
let mut lints = std::collections::BTreeMap::new();
lints.insert("E001".to_owned(), brink_project_config::LintLevel::Deny);
let config = ProjectConfig {
lints,
..ProjectConfig::default()
};
let warnings = BrinkConfigWarnings::from_config(Some(&config));
assert_eq!(warnings.0.len(), 1);
assert!(
warnings.0[0].contains("E001") && warnings.0[0].contains("not overridable"),
"unexpected message: {warnings:?}"
);
}
}