use qubit_codec::BufferedConvertHooks;
use crate::{
CharsetDecodeError,
CharsetDecodeErrorKind,
CharsetDecodeHooks,
CharsetDecodePolicy,
CharsetEncodeError,
CharsetEncodeHooks,
CharsetEncodePolicy,
CharsetEncodeProbe,
};
use super::{
charset_codec::CharsetCodec,
charset_convert_error::CharsetConvertError,
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub(super) struct CharsetConvertHooks<Unit> {
decode_policy: CharsetDecodePolicy,
encode_policy: CharsetEncodePolicy,
encode_hooks: CharsetEncodeHooks<Unit>,
}
impl<Unit> CharsetConvertHooks<Unit> {
#[must_use]
#[inline(always)]
pub(super) const fn with_policies(
decode_policy: CharsetDecodePolicy,
encode_policy: CharsetEncodePolicy,
encode_hooks: CharsetEncodeHooks<Unit>,
) -> Self {
Self {
decode_policy,
encode_policy,
encode_hooks,
}
}
}
impl<D, E> BufferedConvertHooks<D, E> for CharsetConvertHooks<E::Unit>
where
D: CharsetCodec,
E: CharsetEncodeProbe,
{
type DecodeError = CharsetDecodeError;
type DecodeHooks = CharsetDecodeHooks;
type EncodeError = CharsetEncodeError;
type EncodeHooks = CharsetEncodeHooks<E::Unit>;
type Error = CharsetConvertError;
#[inline(always)]
fn create_decode_hooks(
&self,
_decode_codec: &D,
_encode_codec: &E,
) -> Self::DecodeHooks {
CharsetDecodeHooks::from_policy(self.decode_policy)
}
#[inline(always)]
fn create_encode_hooks(
&self,
_decode_codec: &D,
_encode_codec: &E,
) -> Self::EncodeHooks {
self.encode_hooks.clone()
}
#[inline(always)]
fn map_decode_error(&self, error: Self::DecodeError) -> Self::Error {
CharsetConvertError::Decode(error)
}
#[inline(always)]
fn map_encode_error(&self, error: Self::EncodeError) -> Self::Error {
CharsetConvertError::Encode(error)
}
#[inline]
fn invalid_input_index(
&self,
decode_codec: &D,
index: usize,
input_len: usize,
) -> Self::Error {
let kind = CharsetDecodeErrorKind::InvalidInputIndex { input_len };
CharsetConvertError::Decode(CharsetDecodeError::new(
decode_codec.charset(),
kind,
index,
))
}
}