#[cfg(feature = "tar_ninres")]
#[macro_use]
extern crate cfg_if;
mod error;
#[cfg(feature = "bfres")]
pub mod bfres;
#[cfg(feature = "sarc")]
pub mod sarc;
#[cfg(any(feature = "bfres", feature = "sarc"))]
mod util;
#[cfg(feature = "bfres")]
pub use bfres::*;
pub use error::NinResError;
use num_enum::TryFromPrimitive;
#[cfg(feature = "sarc")]
pub use sarc::*;
#[cfg(any(feature = "bfres", feature = "sarc"))]
pub(crate) use util::*;
#[cfg(any(feature = "bfres", feature = "sarc", feature = "tar_ninres"))]
pub(crate) type Error = NinResError;
#[cfg(any(feature = "bfres", feature = "sarc"))]
pub type NinResResult = Result<NinResFile, Error>;
#[derive(Clone, Copy, Debug, TryFromPrimitive)]
#[repr(u16)]
pub enum ByteOrderMask {
BigEndian = 0xfeff,
LittleEndian = 0xfffe,
}
#[cfg(any(feature = "bfres", feature = "sarc"))]
#[derive(Clone)]
pub enum NinResFile {
#[cfg(feature = "bfres")]
Bfres(bfres::Bfres),
#[cfg(feature = "sarc")]
Sarc(sarc::Sarc),
}
#[cfg(any(feature = "bfres", feature = "sarc"))]
impl NinResFile {
pub fn get_extension(&self) -> &str {
match self {
#[cfg(feature = "bfres")]
Self::Bfres(_) => "bfres",
#[cfg(feature = "sarc")]
Self::Sarc(_) => "sarc",
}
}
}
#[cfg(any(feature = "bfres", feature = "sarc"))]
pub trait NinRes {
fn as_ninres(&self) -> NinResResult;
fn into_ninres(self) -> NinResResult;
}
#[cfg(any(feature = "bfres", feature = "sarc"))]
impl NinRes for &[u8] {
fn as_ninres(&self) -> NinResResult {
match std::str::from_utf8(&self[..4])? {
#[cfg(feature = "sarc")]
"SARC" => Ok(NinResFile::Sarc(Sarc::new(self)?)),
#[cfg(feature = "bfres")]
"FRES" => Ok(NinResFile::Bfres(Bfres::new(self)?)),
_ => Err(NinResError::TypeUnknownOrNotImplemented([
self[0], self[1], self[2], self[3],
])),
}
}
fn into_ninres(self) -> NinResResult {
match std::str::from_utf8(&self[..4])? {
#[cfg(feature = "sarc")]
"SARC" => Ok(NinResFile::Sarc(Sarc::new(self)?)),
#[cfg(feature = "bfres")]
"FRES" => Ok(NinResFile::Bfres(Bfres::new(self)?)),
_ => Err(NinResError::TypeUnknownOrNotImplemented([
self[0], self[1], self[2], self[3],
])),
}
}
}
#[cfg(any(feature = "bfres", feature = "sarc"))]
impl NinRes for Vec<u8> {
fn as_ninres(&self) -> NinResResult {
match std::str::from_utf8(&self[..4])? {
#[cfg(feature = "sarc")]
"SARC" => Ok(NinResFile::Sarc(Sarc::new(self)?)),
#[cfg(feature = "bfres")]
"FRES" => Ok(NinResFile::Bfres(Bfres::new(self)?)),
_ => Err(NinResError::TypeUnknownOrNotImplemented([
self[0], self[1], self[2], self[3],
])),
}
}
fn into_ninres(self) -> NinResResult {
match std::str::from_utf8(&self[..4])? {
#[cfg(feature = "sarc")]
"SARC" => Ok(NinResFile::Sarc(Sarc::new(&self[..])?)),
#[cfg(feature = "bfres")]
"FRES" => Ok(NinResFile::Bfres(Bfres::new(&self[..])?)),
_ => Err(NinResError::TypeUnknownOrNotImplemented([
self[0], self[1], self[2], self[3],
])),
}
}
}
#[cfg(feature = "tar_ninres")]
pub trait IntoTar {
fn into_tar(self, mode: u32) -> Result<std::io::Cursor<Vec<u8>>, Error>;
}