#[rustfmt::skip]
use alloc::string::{String, ToString};
use derive_builder::Builder;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Builder)]
#[builder(no_std, default, pattern = "owned", build_fn(name = "try_build"))]
#[allow(non_snake_case)]
pub struct CustomOptions {
pub all_to_normal_replace_pancham_varga_varna_with_n: bool,
pub brahmic_to_brahmic_replace_pancham_varga_varna_with_anusvAra: bool,
pub all_to_sinhala_use_conjunct_enabling_halant: bool,
pub all_to_normal_remove_virAma_and_double_virAma: bool,
pub all_to_normal_replace_avagraha_with_a: bool,
pub normal_to_all_use_typing_chars: bool,
pub all_to_normal_preserve_specific_chars: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct UnknownCustomOptionKey;
impl CustomOptions {
pub const ENTRY_COUNT: usize = 7;
pub const KEYS: &'static [&'static str] = &[
"all_to_normal:replace_pancham_varga_varna_with_n",
"brahmic_to_brahmic:replace_pancham_varga_varna_with_anusvAra",
"all_to_sinhala:use_conjunct_enabling_halant",
"all_to_normal:remove_virAma_and_double_virAma",
"all_to_normal:replace_avagraha_with_a",
"normal_to_all:use_typing_chars",
"all_to_normal:preserve_specific_chars",
];
#[inline]
pub const fn all_enabled() -> Self {
Self {
all_to_normal_replace_pancham_varga_varna_with_n: true,
brahmic_to_brahmic_replace_pancham_varga_varna_with_anusvAra: true,
all_to_sinhala_use_conjunct_enabling_halant: true,
all_to_normal_remove_virAma_and_double_virAma: true,
all_to_normal_replace_avagraha_with_a: true,
normal_to_all_use_typing_chars: true,
all_to_normal_preserve_specific_chars: true,
}
}
#[inline]
#[rustfmt::skip]
pub fn try_set(
&mut self,
key: &str,
value: bool,
) -> Result<(), UnknownCustomOptionKey> {
match key {
"all_to_normal:replace_pancham_varga_varna_with_n" => {
self.all_to_normal_replace_pancham_varga_varna_with_n = value;
Ok(())
}
"brahmic_to_brahmic:replace_pancham_varga_varna_with_anusvAra" => {
self.brahmic_to_brahmic_replace_pancham_varga_varna_with_anusvAra = value;
Ok(())
}
"all_to_sinhala:use_conjunct_enabling_halant" => {
self.all_to_sinhala_use_conjunct_enabling_halant = value;
Ok(())
}
"all_to_normal:remove_virAma_and_double_virAma" => {
self.all_to_normal_remove_virAma_and_double_virAma = value;
Ok(())
}
"all_to_normal:replace_avagraha_with_a" => {
self.all_to_normal_replace_avagraha_with_a = value;
Ok(())
}
"normal_to_all:use_typing_chars" => {
self.normal_to_all_use_typing_chars = value;
Ok(())
}
"all_to_normal:preserve_specific_chars" => {
self.all_to_normal_preserve_specific_chars = value;
Ok(())
}
_ => Err(UnknownCustomOptionKey),
}
}
#[inline]
pub fn get(&self, key: &str) -> Result<bool, UnknownCustomOptionKey> {
match key {
"all_to_normal:replace_pancham_varga_varna_with_n" => {
Ok(self.all_to_normal_replace_pancham_varga_varna_with_n)
}
"brahmic_to_brahmic:replace_pancham_varga_varna_with_anusvAra" => {
Ok(self.brahmic_to_brahmic_replace_pancham_varga_varna_with_anusvAra)
}
"all_to_sinhala:use_conjunct_enabling_halant" => {
Ok(self.all_to_sinhala_use_conjunct_enabling_halant)
}
"all_to_normal:remove_virAma_and_double_virAma" => {
Ok(self.all_to_normal_remove_virAma_and_double_virAma)
}
"all_to_normal:replace_avagraha_with_a" => {
Ok(self.all_to_normal_replace_avagraha_with_a)
}
"normal_to_all:use_typing_chars" => Ok(self.normal_to_all_use_typing_chars),
"all_to_normal:preserve_specific_chars" => {
Ok(self.all_to_normal_preserve_specific_chars)
}
_ => Err(UnknownCustomOptionKey),
}
}
#[inline]
#[rustfmt::skip]
pub fn as_entries(&self) -> [(&'static str, bool); Self::ENTRY_COUNT] {
[
(
"all_to_normal:replace_pancham_varga_varna_with_n",
self.all_to_normal_replace_pancham_varga_varna_with_n,
),
(
"brahmic_to_brahmic:replace_pancham_varga_varna_with_anusvAra",
self.brahmic_to_brahmic_replace_pancham_varga_varna_with_anusvAra,
),
(
"all_to_sinhala:use_conjunct_enabling_halant",
self.all_to_sinhala_use_conjunct_enabling_halant,
),
(
"all_to_normal:remove_virAma_and_double_virAma",
self.all_to_normal_remove_virAma_and_double_virAma,
),
(
"all_to_normal:replace_avagraha_with_a",
self.all_to_normal_replace_avagraha_with_a,
),
("normal_to_all:use_typing_chars", self.normal_to_all_use_typing_chars),
(
"all_to_normal:preserve_specific_chars",
self.all_to_normal_preserve_specific_chars,
),
]
}
#[inline]
pub fn to_options_map<M>(&self) -> M
where
M: FromIterator<(String, bool)>,
{
self.as_entries()
.iter()
.copied()
.map(|(key, enabled)| (key.to_string(), enabled))
.collect()
}
pub fn try_from_map<M, K, V>(map: M) -> Result<Self, UnknownCustomOptionKey>
where
M: IntoIterator<Item = (K, V)>,
K: AsRef<str>,
V: core::borrow::Borrow<bool>,
{
let mut options = Self::default();
for (key, enabled) in map {
options.try_set(key.as_ref(), *enabled.borrow())?;
}
Ok(options)
}
#[inline]
pub fn try_from_pairs<I, S>(pairs: I) -> Result<Self, UnknownCustomOptionKey>
where
I: IntoIterator<Item = (S, bool)>,
S: AsRef<str>,
{
Self::try_from_map(pairs)
}
#[inline]
pub fn try_from_optional_map<M, K, V>(
map: Option<M>,
) -> Result<Option<Self>, UnknownCustomOptionKey>
where
M: IntoIterator<Item = (K, V)>,
K: AsRef<str>,
V: core::borrow::Borrow<bool>,
{
map.map(Self::try_from_map).transpose()
}
}
impl CustomOptionsBuilder {
#[inline]
pub fn build(self) -> CustomOptions {
self.try_build()
.expect("CustomOptionsBuilder: infallible with `#[builder(default)]`")
}
}