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)), + } + } +}