use std::io::Write;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().skip(1).collect();
let path = args
.first()
.ok_or("usage: cat <path> [offset] [len] [block_size]")?;
let offset: u64 = args.get(1).map_or(Ok(0), |a| a.parse())?;
let block_size: Option<u64> = args.get(3).map(|a| a.parse()).transpose()?;
let source = gwseq_io::source::open(path, block_size, None)?;
let len: usize = match args.get(2) {
Some(a) => a.parse()?,
None => (source.len()? - offset.min(source.len()?)) as usize,
};
let data = source.read_at(offset, len)?;
std::io::stdout().write_all(&data)?;
Ok(())
}