use qubit_codec::{
BufferedDecodeEngine,
BufferedDecoder,
BufferedTranscoder,
CapacityError,
FinishError,
TranscodeProgress,
};
use crate::{
CharsetCodec,
CharsetDecodeError,
MalformedAction,
};
use super::{
charset_decode_hooks::CharsetDecodeHooks,
charset_decode_policy::CharsetDecodePolicy,
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CharsetDecoder<C>
where
C: CharsetCodec,
{
engine: BufferedDecodeEngine<C, CharsetDecodeHooks>,
policy: CharsetDecodePolicy,
}
impl<C> CharsetDecoder<C>
where
C: CharsetCodec,
{
#[must_use]
#[inline(always)]
pub fn new(codec: C) -> Self {
Self::with_policy(codec, CharsetDecodePolicy::default())
}
#[must_use]
#[inline]
pub fn with_policy(codec: C, policy: CharsetDecodePolicy) -> Self {
let hooks = CharsetDecodeHooks::from_policy(policy);
Self {
engine: BufferedDecodeEngine::new(codec, hooks),
policy,
}
}
#[must_use]
#[inline(always)]
pub const fn malformed_action(&self) -> MalformedAction {
self.policy.malformed_action()
}
#[must_use]
#[inline(always)]
pub const fn replacement(&self) -> char {
self.policy.replacement()
}
}
impl<C> BufferedDecoder<C::Unit, char> for CharsetDecoder<C> where
C: CharsetCodec
{
}
impl<C> BufferedTranscoder<C::Unit, char> for CharsetDecoder<C>
where
C: CharsetCodec,
{
type Error = CharsetDecodeError;
#[inline(always)]
fn max_output_len(&self, input_len: usize) -> Result<usize, CapacityError> {
self.engine.max_output_len(input_len)
}
#[inline(always)]
fn max_finish_output_len(&self) -> Result<usize, CapacityError> {
Ok(self.engine.max_finish_output_len())
}
#[inline(always)]
fn reset(&mut self) {
self.engine.reset();
}
#[inline(always)]
fn transcode(
&mut self,
input: &[C::Unit],
input_index: usize,
output: &mut [char],
output_index: usize,
) -> Result<TranscodeProgress, Self::Error> {
self.engine
.transcode(input, input_index, output, output_index)
}
#[inline(always)]
fn finish(
&mut self,
output: &mut [char],
output_index: usize,
) -> Result<usize, FinishError<Self::Error>> {
self.engine.finish(output, output_index)
}
}