#[allow(unused_imports, reason = "used by docs")]
use super::advanced;
#[allow(unused_imports, reason = "used by docs")]
use super::{UnicodeNormalizationForm, decompose_buffer, decompose_char, map};
#[allow(unused_imports, reason = "used by docs")]
use crate::ErrorKind;
#[allow(unused_imports, reason = "used by docs")]
use utf8proc_sys::utf8proc_option_t;
#[derive(Clone, Debug, Default)]
#[non_exhaustive]
#[must_use]
pub struct TransformOptions {
pub unassigned_codepoint_handling: UnassignedCodepointHandling,
pub ignore: bool,
pub case_fold: bool,
pub grapheme_boundary_markers: bool,
pub compat: bool,
pub composition: Option<CompositionOptions>,
pub lump: bool,
pub nlf_conversion: Option<NlfConversionMode>,
pub strip_control_codes: bool,
pub stable: bool,
}
impl TransformOptions {
#[track_caller]
#[inline] pub(crate) fn validate_utf8(&self) -> &Self {
assert!(
!self.grapheme_boundary_markers,
"Enabling `grapheme_boundary_markers` is forbidden in the simple interface",
);
match self.unassigned_codepoint_handling {
UnassignedCodepointHandling::Forbid | UnassignedCodepointHandling::Strip => { }
UnassignedCodepointHandling::Allow => {
panic!("Setting `unassigned_codepoint_handling=Allow` is forbidden in the simple interface")
}
}
self
}
#[track_caller]
#[inline]
#[deny(unused_variables)]
pub(crate) unsafe fn to_ffi(&self) -> utf8proc_option_t {
let TransformOptions {
unassigned_codepoint_handling,
ignore,
case_fold,
grapheme_boundary_markers,
compat,
ref composition,
lump,
nlf_conversion,
strip_control_codes,
stable,
} = *self;
let mut res = utf8proc_option_t::NONE;
res |= match unassigned_codepoint_handling {
UnassignedCodepointHandling::Forbid => utf8proc_option_t::UTF8PROC_REJECTNA,
UnassignedCodepointHandling::Strip => utf8proc_option_t::UTF8PROC_STRIPNA,
UnassignedCodepointHandling::Allow => utf8proc_option_t::NONE,
};
if ignore {
res |= utf8proc_option_t::UTF8PROC_IGNORE;
}
if case_fold {
res |= utf8proc_option_t::UTF8PROC_CASEFOLD;
}
if grapheme_boundary_markers {
res |= utf8proc_option_t::UTF8PROC_CHARBOUND;
}
if compat {
res |= utf8proc_option_t::UTF8PROC_COMPAT;
}
if let Some(composition) = composition {
res |= match composition.direction {
CompositionDirection::Compose => utf8proc_option_t::UTF8PROC_COMPOSE,
CompositionDirection::Decompose => utf8proc_option_t::UTF8PROC_DECOMPOSE,
}
}
if lump {
res |= utf8proc_option_t::UTF8PROC_LUMP;
}
res |= match nlf_conversion {
None => utf8proc_option_t::NONE,
Some(NlfConversionMode::LineSeparation) => utf8proc_option_t::UTF8PROC_NLF2LS,
Some(NlfConversionMode::ParagraphSeparator) => utf8proc_option_t::UTF8PROC_NLF2PS,
Some(NlfConversionMode::Unknown) => utf8proc_option_t::UTF8PROC_NLF2LF,
};
if strip_control_codes {
res |= utf8proc_option_t::UTF8PROC_STRIPCC;
}
if stable {
res |= utf8proc_option_t::UTF8PROC_STABLE;
}
res
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default)]
#[must_use]
pub enum UnassignedCodepointHandling {
#[default]
Forbid,
Strip,
Allow,
}
#[derive(Clone, Debug)]
#[non_exhaustive]
#[must_use]
pub struct CompositionOptions {
pub direction: CompositionDirection,
pub strip_marks: bool,
}
impl CompositionOptions {
#[inline]
pub const fn compose() -> CompositionOptions {
CompositionOptions {
direction: CompositionDirection::Compose,
strip_marks: false,
}
}
#[inline]
pub const fn decompose() -> CompositionOptions {
CompositionOptions {
direction: CompositionDirection::Decompose,
..Self::compose()
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
#[must_use]
pub enum CompositionDirection {
Compose,
Decompose,
}
#[derive(Copy, Clone, Debug)]
#[non_exhaustive]
#[must_use]
pub enum NlfConversionMode {
LineSeparation,
ParagraphSeparator,
Unknown,
}