From a79ae33c14dbff62e2f4eedb746e048aa4b79a07 Mon Sep 17 00:00:00 2001 From: Christian Ebner Date: Thu, 23 May 2024 08:54:58 +0200 Subject: [PATCH] lib: add type for input/output variant differentiation Introduce an enum which stores 2 different possible variants of inputs or outputs to be passed to encoder and decoder/accessor instances, depending whether to read/write a fully self contained pxar archive or whether to split off the payload stream into a separate input/output. Co-authored-by: Dominik Csapak Signed-off-by: Christian Ebner --- src/lib.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 210c4b1..f784c9e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -494,3 +494,65 @@ impl Entry { } } } + +#[derive(Clone)] +/// Possible variants of the encoder output and decoder as well as accessor inputs +/// +/// Allow to have a unified or split input/output, depending on whether this is a split +/// archive or not. +pub enum PxarVariant { + /// All of the pxar archive is contained within the given input/output + Unified(A), + /// Metadata and payload are split into separate inputs/outputs + Split(A, P), +} + +impl PxarVariant { + pub fn archive(&self) -> &A { + match self { + PxarVariant::Unified(a) => a, + PxarVariant::Split(a, _) => a, + } + } + + pub fn archive_mut(&mut self) -> &mut A { + match self { + PxarVariant::Unified(a) => a, + PxarVariant::Split(a, _) => a, + } + } + + pub fn payload(&self) -> Option<&P> { + match self { + PxarVariant::Unified(_) => None, + PxarVariant::Split(_, p) => Some(p), + } + } + + pub fn payload_mut(&mut self) -> Option<&mut P> { + match self { + PxarVariant::Unified(_) => None, + PxarVariant::Split(_, p) => Some(p), + } + } + + pub fn wrap_multi OUT1, F2: Fn(P) -> OUT2>( + self, + f1: F1, + f2: F2, + ) -> PxarVariant { + match self { + PxarVariant::Unified(a) => PxarVariant::Unified(f1(a)), + PxarVariant::Split(a, p) => PxarVariant::Split(f1(a), f2(p)), + } + } +} + +impl PxarVariant { + pub fn wrap OUT>(self, f: F) -> PxarVariant { + match self { + PxarVariant::Unified(a) => PxarVariant::Unified(f(a)), + PxarVariant::Split(a, p) => PxarVariant::Split(f(a), f(p)), + } + } +}