Sebastian Thielrefactor3a8fb616 years agoHistory
53 lines · 1.4 KB · Rust
RawDownload
use crate::pack;use std::{    convert::TryFrom,    path::{Path, PathBuf},}; pub mod locate;pub mod write; #[derive(thiserror::Error, Debug)]pub enum Error {    #[error("An 'idx' extension is expected of an index file: '{0}'")]    InvalidPath(PathBuf),    #[error(transparent)]    Pack(#[from] pack::data::parse::Error),    #[error(transparent)]    Index(#[from] pack::index::init::Error),} /// A packfile with an indexpub struct Bundle {    pub pack: pack::data::File,    pub index: pack::index::File,} impl Bundle {    /// `path` is either a pack file or an index file    pub fn at(path: impl AsRef<Path>) -> Result<Self, Error> {        Self::try_from(path.as_ref())    }} impl TryFrom<&Path> for Bundle {    type Error = Error;     fn try_from(path: &Path) -> Result<Self, Self::Error> {        let ext = path            .extension()            .and_then(|e| e.to_str())            .ok_or_else(|| Error::InvalidPath(path.to_owned()))?;        Ok(match ext {            "idx" => Self {                index: pack::index::File::at(path)?,                pack: pack::data::File::at(path.with_extension("pack"))?,            },            "pack" => Self {                pack: pack::data::File::at(path)?,                index: pack::index::File::at(path.with_extension("idx"))?,            },            _ => return Err(Error::InvalidPath(path.to_owned())),        })    }}