use core::str::{from_utf8_unchecked, from_utf8_unchecked_mut};
use crate::implementation::validate_utf8_basic;
#[derive(Copy, Eq, PartialEq, Clone, Debug)]
pub struct Utf8Error;
impl core::fmt::Display for Utf8Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("invalid utf-8 sequence")
}
}
#[cfg(feature = "std")]
impl std::error::Error for Utf8Error {}
#[inline]
pub fn from_utf8(input: &[u8]) -> Result<&str, Utf8Error> {
unsafe {
validate_utf8_basic(input)?;
Ok(from_utf8_unchecked(input))
}
}
#[inline]
pub fn from_utf8_mut(input: &mut [u8]) -> Result<&mut str, Utf8Error> {
unsafe {
validate_utf8_basic(input)?;
Ok(from_utf8_unchecked_mut(input))
}
}
#[cfg(feature = "public_imp")]
pub mod imp {
use crate::basic;
pub trait Utf8Validator {
#[must_use]
unsafe fn new() -> Self
where
Self: Sized;
unsafe fn update(&mut self, input: &[u8]);
unsafe fn finalize(self) -> core::result::Result<(), basic::Utf8Error>;
}
pub trait ChunkedUtf8Validator {
#[must_use]
unsafe fn new() -> Self
where
Self: Sized;
unsafe fn update_from_chunks(&mut self, input: &[u8]);
unsafe fn finalize(
self,
remaining_input: core::option::Option<&[u8]>,
) -> core::result::Result<(), basic::Utf8Error>;
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub mod x86 {
pub mod avx2 {
pub use crate::implementation::x86::avx2::validate_utf8_basic as validate_utf8;
pub use crate::implementation::x86::avx2::ChunkedUtf8ValidatorImp;
pub use crate::implementation::x86::avx2::Utf8ValidatorImp;
}
pub mod sse42 {
pub use crate::implementation::x86::sse42::validate_utf8_basic as validate_utf8;
pub use crate::implementation::x86::sse42::ChunkedUtf8ValidatorImp;
pub use crate::implementation::x86::sse42::Utf8ValidatorImp;
}
}
#[cfg(all(feature = "aarch64_neon", target_arch = "aarch64"))]
pub mod aarch64 {
pub mod neon {
pub use crate::implementation::aarch64::neon::validate_utf8_basic as validate_utf8;
pub use crate::implementation::aarch64::neon::ChunkedUtf8ValidatorImp;
pub use crate::implementation::aarch64::neon::Utf8ValidatorImp;
}
}
#[cfg(all(target_arch = "wasm32", target_feature = "simd128"))]
pub mod wasm32 {
pub mod simd128 {
pub use crate::implementation::wasm32::simd128::validate_utf8_basic as validate_utf8;
pub use crate::implementation::wasm32::simd128::ChunkedUtf8ValidatorImp;
pub use crate::implementation::wasm32::simd128::Utf8ValidatorImp;
}
}
}