mod iter;
mod str;
#[cfg(feature = "alloc")]
mod string;
pub use iter::{Cesu8CharIndices, Cesu8Chars};
pub use str::Cesu8Str;
#[cfg(feature = "alloc")]
pub use string::Cesu8String;
#[cfg(feature = "alloc")]
use alloc::borrow::Cow;
#[inline]
#[must_use]
pub const fn len_cesu8(c: char) -> usize {
super::len_cesu8::<false>(c as u32)
}
#[inline]
pub fn encode_cesu8(c: char, dst: &mut [u8]) -> &mut [u8] {
super::encode_cesu8_raw::<false>(c as u32, dst)
}
#[cfg(feature = "alloc")]
#[inline]
#[must_use]
pub fn from_cesu8(str: &Cesu8Str) -> Cow<'_, str> {
super::from_cesu8::<false>(&str.internal)
}
#[cfg(feature = "alloc")]
#[inline]
#[must_use]
pub fn from_utf8(str: &str) -> Cow<'_, Cesu8Str> {
match super::from_utf8::<true>(str) {
Cow::Owned(string) => Cow::Owned(unsafe { Cesu8String::from_internal_unchecked(string) }),
Cow::Borrowed(str) => Cow::Borrowed(unsafe { Cesu8Str::from_internal_unchecked(str) }),
}
}
pub mod macros {
#[macro_export]
macro_rules! cesu8_str {
($str:tt) => {{
const _CESU8_STR_MACRO_STR: &str = $str;
const _CESU8_STR_MACRO_LEN: usize =
$crate::cesu8::macros::required_cesu8_len(_CESU8_STR_MACRO_STR);
const _CESU8_STR_MACRO_BUF: [u8; _CESU8_STR_MACRO_LEN] =
$crate::cesu8::macros::create_cesu8_array(_CESU8_STR_MACRO_STR);
unsafe { $crate::cesu8::Cesu8Str::from_cesu8_unchecked(&_CESU8_STR_MACRO_BUF) }
}};
}
#[inline]
#[must_use]
pub const fn required_cesu8_len(str: &str) -> usize {
crate::required_len::<false>(str)
}
#[inline]
#[must_use]
pub const fn create_cesu8_array<const N: usize>(str: &str) -> [u8; N] {
crate::create_array::<false, N>(str)
}
}
#[cfg(test)]
mod tests {
use crate::validate_cesu8_internal;
use super::encode_cesu8;
#[test]
fn valid_roundtrip() {
let mut buf = [0; 6];
for i in 0..u32::MAX {
if let Some(c) = char::from_u32(i) {
let check = encode_cesu8(c, &mut buf);
validate_cesu8_internal::<false>(check).unwrap();
}
}
}
}