use std::collections::BTreeSet;
use rustc_span::Symbol;
use crate::common::resolve_symbol_set;
const CONFIG_KEY: &str = "perfectionist::unicode_ellipsis_in_panic_messages";
const DEFAULT_MACROS: &[&str] = &[
"panic",
"unimplemented",
"todo",
"unreachable",
"debug_unreachable",
"assert",
"assert_eq",
"assert_ne",
"debug_assert",
"debug_assert_eq",
"debug_assert_ne",
];
const DEFAULT_METHODS: &[&str] = &["expect", "expect_err"];
#[derive(Debug, Default, serde::Deserialize)]
#[serde(default, deny_unknown_fields, rename_all = "snake_case")]
#[cfg_attr(
dylint_lib = "perfectionist",
expect(
perfectionist::unicode_ellipsis_in_docs,
reason = "this rule's config rustdoc names the U+2026 glyph it governs"
)
)]
struct Config {
extra_macros: Vec<String>,
ignore_macros: Vec<String>,
extra_methods: Vec<String>,
ignore_methods: Vec<String>,
extra_flagged_chars: Vec<char>,
}
pub(super) struct UnicodeEllipsisInPanicMessages {
pub(super) flagged_chars: Vec<char>,
pub(super) macros: BTreeSet<Symbol>,
pub(super) methods: BTreeSet<Symbol>,
}
impl UnicodeEllipsisInPanicMessages {
pub(super) fn new() -> Self {
let config: Config = dylint_linting::config_or_default(CONFIG_KEY);
let mut flagged_chars = vec!['\u{2026}'];
for character in config.extra_flagged_chars {
if !flagged_chars.contains(&character) {
flagged_chars.push(character);
}
}
Self {
flagged_chars,
macros: resolve_symbol_set(DEFAULT_MACROS, config.extra_macros, config.ignore_macros),
methods: resolve_symbol_set(
DEFAULT_METHODS,
config.extra_methods,
config.ignore_methods,
),
}
}
}