use super::*;
use crate::dictionary::PreparedDictionary;
use crate::{Operation, StreamConfig};
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum FramedEncodeOperation {
#[default]
Process,
Finish,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum FramedEncoderStatus {
NeedsInput,
NeedsOutput,
Finished,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct FramedEncodeProgress {
pub consumed: usize,
pub produced: usize,
pub status: FramedEncoderStatus,
}
#[derive(Debug)]
pub struct FramedEncoderSession<'c> {
pub(super) owner: &'c mut FramedCompressor,
}
impl FramedEncoderSession<'_> {
pub fn process(
&mut self,
output: &mut [u8],
operation: FramedEncodeOperation,
) -> Result<FramedEncodeProgress, FramedEncodeFailure> {
self.owner.engine.process(output, operation)
}
pub fn metadata(
&mut self,
kind: MetadataKind,
fields: &[MetadataField<'_>],
) -> Result<(), FramedEncodeError> {
self.metadata_with_options(kind, fields, Default::default())
}
pub fn metadata_with_options(
&mut self,
kind: MetadataKind,
fields: &[MetadataField<'_>],
options: MetadataOptions<'_>,
) -> Result<(), FramedEncodeError> {
self.owner
.engine
.metadata(&mut self.owner.raw, kind, fields, options)
}
pub fn repeat_metadata_fields(&mut self, codes: &[[u8; 2]]) -> Result<(), FramedEncodeError> {
self.owner.engine.repeat(codes)
}
pub fn padding(&mut self, bytes: usize) -> Result<(), FramedEncodeError> {
self.owner.engine.padding(bytes)
}
pub fn resource(
&mut self,
options: ResourceOptions,
stream: StreamConfig,
) -> Result<FramedResourceSession<'_, 'static>, FramedEncodeError> {
self.owner.engine.begin_resource(
&mut self.owner.raw,
options,
stream,
ResourceEncoding::Brotli,
)?;
Ok(FramedResourceSession {
owner: self.owner,
dictionary: None,
})
}
pub fn resource_with_dictionary<'s, 'dict>(
&'s mut self,
options: ResourceOptions,
stream: StreamConfig,
dictionary: &'dict PreparedDictionary,
references: &[DictionaryReference],
) -> Result<FramedResourceSession<'s, 'dict>, FramedEncodeError> {
self.owner.engine.begin_resource(
&mut self.owner.raw,
options,
stream,
ResourceEncoding::Shared {
dictionary,
references,
},
)?;
Ok(FramedResourceSession {
owner: self.owner,
dictionary: Some(dictionary),
})
}
pub fn uncompressed_resource(
&mut self,
options: ResourceOptions,
) -> Result<FramedResourceSession<'_, 'static>, FramedEncodeError> {
self.owner.engine.begin_resource(
&mut self.owner.raw,
options,
Default::default(),
ResourceEncoding::Uncompressed,
)?;
Ok(FramedResourceSession {
owner: self.owner,
dictionary: None,
})
}
pub const fn total_in(&self) -> u64 {
self.owner.engine.total_in
}
pub const fn total_out(&self) -> u64 {
self.owner.engine.total_out
}
pub const fn resources_encoded(&self) -> u64 {
self.owner.engine.resources()
}
pub const fn is_finished(&self) -> bool {
self.owner.engine.finished()
}
pub const fn next_chunk_offset(&self) -> u64 {
self.owner.engine.offset()
}
}
impl Drop for FramedEncoderSession<'_> {
fn drop(&mut self) {
self.owner.cancel();
}
}
#[derive(Debug)]
pub struct FramedResourceSession<'session, 'dict> {
pub(super) owner: &'session mut FramedCompressor,
dictionary: Option<&'dict PreparedDictionary>,
}
impl FramedResourceSession<'_, '_> {
pub fn process(
&mut self,
input: &[u8],
output: &mut [u8],
operation: Operation,
) -> Result<FramedEncodeProgress, FramedEncodeFailure> {
self.owner.engine.process_resource(
&mut self.owner.raw,
self.dictionary,
input,
output,
operation,
)
}
pub const fn is_finished(&self) -> bool {
self.owner.engine.resource_finished()
}
pub const fn total_in(&self) -> u64 {
self.owner.engine.resource_in()
}
pub const fn total_out(&self) -> u64 {
self.owner.engine.resource_out()
}
}
impl Drop for FramedResourceSession<'_, '_> {
fn drop(&mut self) {
self.owner.engine.release_resource(&mut self.owner.raw);
}
}