#[derive(Debug,PartialEq,Eq,Clone,Copy)]
#[non_exhaustive]
pub enum Code {
LanguageTiebreak,
UnknownForcedLanguage,
UnknownLanguage,
UnknownExcludedLanguage,
UnknownModuleScope,
UnknownSectionLanguage,
DuplicateLanguage,
LanguageWithoutName,
LanguageClaimsNothing,
LanguageLostEveryClaim,
CommentPairNeverCloses,
LanguageFileUnreadable,
ConflictLineSkipped,
ConfigValueIgnored,
ConfigSectionUnknown,
ConfigSectionRepeated,
CommandIgnored,
ConfigStyleInvalid,
ThemeUnavailable
}
impl Code {
pub fn name(self) -> &'static str {
match self {
Self::LanguageTiebreak => "language-tiebreak",
Self::UnknownForcedLanguage => "unknown-forced-language",
Self::UnknownLanguage => "unknown-language",
Self::UnknownExcludedLanguage => "unknown-excluded-language",
Self::UnknownModuleScope => "unknown-module-scope",
Self::UnknownSectionLanguage => "unknown-section-language",
Self::DuplicateLanguage => "duplicate-language",
Self::LanguageWithoutName => "language-without-name",
Self::LanguageClaimsNothing => "language-claims-nothing",
Self::LanguageLostEveryClaim => "language-lost-every-claim",
Self::CommentPairNeverCloses => "comment-pair-never-closes",
Self::LanguageFileUnreadable => "language-file-unreadable",
Self::ConflictLineSkipped => "conflict-line-skipped",
Self::ConfigValueIgnored => "config-value-ignored",
Self::ConfigSectionUnknown => "config-section-unknown",
Self::ConfigSectionRepeated => "config-section-repeated",
Self::CommandIgnored => "command-ignored",
Self::ConfigStyleInvalid => "config-style-invalid",
Self::ThemeUnavailable => "theme-unavailable"
}
}
pub fn affects(self) -> Affects {
match self {
Self::LanguageTiebreak | Self::DuplicateLanguage | Self::LanguageWithoutName
| Self::LanguageFileUnreadable | Self::UnknownSectionLanguage
| Self::CommentPairNeverCloses => Affects::Counts,
Self::UnknownForcedLanguage | Self::UnknownLanguage | Self::UnknownExcludedLanguage
| Self::UnknownModuleScope
| Self::LanguageClaimsNothing | Self::LanguageLostEveryClaim
| Self::ConflictLineSkipped | Self::ConfigValueIgnored
| Self::ConfigSectionUnknown | Self::ConfigSectionRepeated
| Self::CommandIgnored | Self::ConfigStyleInvalid
| Self::ThemeUnavailable => Affects::Settings
}
}
}
#[derive(Debug,PartialEq,Eq,Clone)]
#[non_exhaustive]
pub struct Warning {
pub code: Code,
pub subject: String,
pub message: String
}
impl Warning {
pub fn new(code: Code, subject: &str, message: String) -> Self {
Warning { code, subject: subject.to_owned(), message }
}
pub fn affects(&self) -> Affects {
self.code.affects()
}
}
#[derive(Debug,PartialEq,Eq,Clone,Copy)]
pub enum Affects {
Counts,
Settings
}
impl Affects {
pub fn name(self) -> &'static str {
match self {
Self::Counts => "counts",
Self::Settings => "settings"
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_warning_carries_a_stable_code_and_a_readable_message() {
let warning = Warning::new(Code::LanguageTiebreak, "m", "the readable half".to_owned());
assert_eq!("language-tiebreak", warning.code.name());
assert_eq!("counts", warning.affects().name());
assert_eq!("settings", Affects::Settings.name());
}
#[test]
fn a_language_that_cannot_be_named_puts_the_counts_in_doubt_and_one_that_claims_nothing_does_not() {
assert_eq!(Affects::Counts, Code::LanguageWithoutName.affects());
assert_eq!(Affects::Settings, Code::LanguageClaimsNothing.affects());
}
}