use super::Result;
use clap::Args;
use hff_std::{hff, Ecc, IdType, Writer, BE, LE, NE};
use log::trace;
use normpath::PathExt;
use std::{fs::File, io::Write, path::PathBuf};
pub const HFF_ARCHIVE: Ecc = Ecc::new("_ARCHIVE");
pub const HFF_DIR: Ecc = Ecc::new("_DIR");
pub const HFF_FILE: Ecc = Ecc::new("_FILE");
pub const HFF_EMBEDDED: Ecc = Ecc::new("_HFF");
pub const HFF_LZMA: Ecc = Ecc::new("_LZMA");
#[derive(Debug, Args)]
pub struct Pack {
pub input: PathBuf,
pub output: PathBuf,
#[arg(short, long, overrides_with = "_no_recurse")]
pub recurse: bool,
#[arg(long = "no-recurse", overrides_with = "recurse")]
pub _no_recurse: bool,
#[arg(long, short)]
pub compress: Option<u32>,
#[arg(long, conflicts_with = "little_endian")]
pub big_endian: bool,
#[arg(long, conflicts_with = "big_endian")]
pub little_endian: bool,
}
impl Pack {
pub fn execute(self) -> Result<()> {
use super::Structure;
let input = self.input.normalize()?;
let input: std::path::PathBuf = input.into();
let structure = Structure::new(&input, self.recurse)?;
let parent = input.parent().unwrap();
trace!("Input: {:?}", input);
trace!("Parent: {:?}", parent);
let structure = structure.strip_prefix(parent)?;
let root = structure.to_tables::<NE>(parent, |_| self.compress)?;
let mut output = File::create(&self.output)?;
if !(self.little_endian || self.big_endian) {
hff([root]).write::<NE>(IdType::EccU64, HFF_ARCHIVE, &mut output)?;
} else {
if self.big_endian {
hff([root]).write::<BE>(IdType::EccU64, HFF_ARCHIVE, &mut output)?;
} else if self.little_endian {
hff([root]).write::<LE>(IdType::EccU64, HFF_ARCHIVE, &mut output)?;
}
}
output.flush()?;
Ok(())
}
}