use std::path::Path;
use std::path::PathBuf;
use crate::ExtractionReport;
use crate::Result;
use crate::SecurityConfig;
#[derive(Debug)]
pub struct Archive {
path: PathBuf,
config: SecurityConfig,
}
impl Archive {
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self> {
let path = path.as_ref().to_path_buf();
Ok(Self {
path,
config: SecurityConfig::default(),
})
}
#[must_use]
pub fn path(&self) -> &Path {
&self.path
}
#[must_use]
pub fn config(&self) -> &SecurityConfig {
&self.config
}
pub fn extract<P: AsRef<Path>>(&self, output_dir: P) -> Result<ExtractionReport> {
crate::api::extract_archive(&self.path, output_dir.as_ref(), &self.config)
}
}
#[derive(Debug, Default)]
pub struct ArchiveBuilder {
archive_path: Option<PathBuf>,
output_dir: Option<PathBuf>,
config: Option<SecurityConfig>,
}
impl ArchiveBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn archive<P: AsRef<Path>>(mut self, path: P) -> Self {
self.archive_path = Some(path.as_ref().to_path_buf());
self
}
#[must_use]
pub fn output_dir<P: AsRef<Path>>(mut self, path: P) -> Self {
self.output_dir = Some(path.as_ref().to_path_buf());
self
}
#[must_use]
pub fn config(mut self, config: SecurityConfig) -> Self {
self.config = Some(config);
self
}
pub fn extract(self) -> Result<ExtractionReport> {
let archive_path =
self.archive_path
.ok_or_else(|| crate::ExtractionError::SecurityViolation {
reason: "archive path not set".to_string(),
})?;
let output_dir =
self.output_dir
.ok_or_else(|| crate::ExtractionError::SecurityViolation {
reason: "output directory not set".to_string(),
})?;
let config = self.config.unwrap_or_default();
crate::api::extract_archive(archive_path, output_dir, &config)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_archive_builder() {
let builder = ArchiveBuilder::new()
.archive("test.tar")
.output_dir("/tmp/test");
assert!(builder.archive_path.is_some());
assert!(builder.output_dir.is_some());
}
#[test]
fn test_archive_builder_missing_path() {
let builder = ArchiveBuilder::new().output_dir("/tmp/test");
let result = builder.extract();
assert!(result.is_err());
}
#[test]
fn test_archive_builder_missing_output() {
let builder = ArchiveBuilder::new().archive("test.tar");
let result = builder.extract();
assert!(result.is_err());
}
}