use crate::feature_cell::FeatureCell;
use crate::Set;
use lazy_static::lazy_static;
use std::ops::Deref;
lazy_static! {
pub(crate) static ref BANNED: FeatureCell<Banned> = FeatureCell::new(Banned(
include_str!("banned_chars.txt")
.lines()
.filter(|s| s.starts_with("U+"))
.map(|s| {
u32::from_str_radix(&s[2..], 16)
.ok()
.and_then(char::from_u32)
.unwrap()
})
.chain(if cfg!(feature = "width") {
['\u{A9C1}', '\u{A9C2}'].as_slice().into_iter().copied()
} else {
[].as_slice().into_iter().copied()
})
.collect()
));
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Banned(Set<char>);
impl Default for Banned {
fn default() -> Self {
BANNED.deref().deref().clone()
}
}
impl Banned {
pub fn new() -> Self {
Self(Default::default())
}
#[cfg(feature = "customize")]
#[cfg_attr(doc, doc(cfg(feature = "customize")))]
pub unsafe fn customize_default() -> &'static mut Self {
BANNED.get_mut()
}
pub(crate) fn contains(&self, c: char) -> bool {
self.0.contains(&c)
}
pub fn insert(&mut self, c: char) {
self.0.insert(c);
}
pub fn remove(&mut self, c: char) {
self.0.remove(&c);
}
}