jubako 0.4.0

The reference implementation of the Jubako container format
Documentation
use crate::common::PackInfo;

#[derive(Debug)]
pub enum MayMissPack<T> {
    MISSING(PackInfo),
    FOUND(T),
}

impl<T> MayMissPack<T> {
    #[inline]
    pub fn map<U, F>(self, f: F) -> MayMissPack<U>
    where
        F: FnOnce(T) -> U,
    {
        match self {
            Self::FOUND(x) => MayMissPack::FOUND(f(x)),
            Self::MISSING(pack_info) => MayMissPack::MISSING(pack_info),
        }
    }

    #[inline]
    pub fn unwrap(self) -> T {
        if let Self::FOUND(x) = self {
            return x;
        }
        panic!("called `MayMissPack::unwrap()` on a `MISSING` value");
    }

    pub fn get(self) -> Option<T> {
        if let Self::FOUND(x) = self {
            Some(x)
        } else {
            None
        }
    }

    pub fn as_ref(&self) -> MayMissPack<&T> {
        match self {
            Self::FOUND(x) => MayMissPack::FOUND(x),
            Self::MISSING(pack_info) => MayMissPack::MISSING(pack_info.clone()),
        }
    }
}

impl<T, E> MayMissPack<Result<T, E>> {
    #[inline]
    pub fn transpose(self) -> Result<MayMissPack<T>, E> {
        match self {
            Self::FOUND(Err(e)) => Err(e),
            Self::FOUND(Ok(x)) => Ok(MayMissPack::FOUND(x)),
            Self::MISSING(pack_info) => Ok(MayMissPack::MISSING(pack_info)),
        }
    }
}

impl<T> MayMissPack<Option<T>> {
    pub fn transpose(self) -> Option<MayMissPack<T>> {
        match self {
            Self::FOUND(None) => None,
            Self::FOUND(Some(x)) => Some(MayMissPack::FOUND(x)),
            Self::MISSING(pack_info) => Some(MayMissPack::MISSING(pack_info)),
        }
    }
}