use std::io::SeekFrom;
use std::io::Seek;
use obsidian_lib::ObbyArchive;
use std::fs::File;
use std::io::{self, Read, Cursor};
use std::env;
fn main() -> io::Result<()> {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <file_path>", args[0]);
return Ok(());
}
let path = &args[1];
println!("Example 1: Memory Buffer");
{
let mut file = File::open(path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
let cursor = Cursor::new(buffer);
let mut archive = ObbyArchive::new(cursor)?;
println!("Entries in archive:");
for entry in archive.list_entries() {
println!("- {}", entry);
}
let json_data = archive.extract_entry("plugin.json")?;
let json_string = String::from_utf8_lossy(&json_data);
println!("\nPlugin JSON contents:\n{}", json_string);
}
println!("\nExample 2: Network Stream Simulation");
{
struct ChunkedReader {
file: File,
position: u64,
}
impl Read for ChunkedReader {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.file.read(buf)
}
}
impl Seek for ChunkedReader {
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
self.position = self.file.seek(pos)?;
Ok(self.position)
}
}
let file = File::open(path)?;
let reader = ChunkedReader {
file,
position: 0,
};
let mut archive = ObbyArchive::new(reader)?;
println!("Entries in archive:");
for entry in archive.list_entries() {
println!("- {}", entry);
}
let json_data = archive.extract_entry("plugin.json")?;
let json_string = String::from_utf8_lossy(&json_data);
println!("\nPlugin JSON contents:\n{}", json_string);
}
Ok(())
}