ya-ar/src/commands/print.rs
2026-02-10 21:24:16 +09:00

34 lines
998 B
Rust

use std::io::Write;
use std::path::PathBuf;
use anyhow::{bail, Result};
use crate::archive::ArchiveReader;
pub fn run(archive: PathBuf, path: String) -> Result<()> {
let reader = ArchiveReader::new_auto()?;
reader.open_filename(&archive, 10240)?;
let needle = path.trim_end_matches('/');
while let Some(entry) = reader.next_header()? {
if let Some(pathname) = entry.pathname() {
let entry_name = pathname.trim_end_matches('/');
if entry_name == needle || pathname == path {
let mut stdout = std::io::stdout().lock();
let mut buf = [0u8; 16384];
loop {
let n = reader.read_data(&mut buf)?;
if n == 0 {
break;
}
stdout.write_all(&buf[..n])?;
}
stdout.flush()?;
return Ok(());
}
}
}
bail!("entry not found: {path}");
}