use std::io;
use bao_tree::{
io::{
fsm::{decode_ranges, encode_ranges_validated, valid_ranges, CreateOutboard},
outboard::PreOrderOutboard,
round_up_to_chunks,
},
BlockSize, ByteRanges, ChunkRanges,
};
use bytes::BytesMut;
use futures_lite::StreamExt;
const BLOCK_SIZE: BlockSize = BlockSize::from_chunk_log(4);
#[tokio::main]
async fn main() -> io::Result<()> {
let mut file = iroh_io::File::open("video.mp4".into()).await?;
let mut ob = PreOrderOutboard::<BytesMut>::create(&mut file, BLOCK_SIZE).await?;
let ranges = ByteRanges::from(0..100000);
let ranges = round_up_to_chunks(&ranges);
let mut to_client = Vec::new();
encode_ranges_validated(file, &mut ob, &ranges, &mut to_client).await?;
let from_server = io::Cursor::new(to_client.as_slice());
let root = ob.root;
let tree = ob.tree;
let mut decoded = iroh_io::File::open("copy.mp4".into()).await?;
let mut ob = PreOrderOutboard {
tree,
root,
data: BytesMut::new(),
};
decode_ranges(from_server, ranges, &mut decoded, &mut ob).await?;
let ranges = ChunkRanges::all();
let mut stream = valid_ranges(&mut ob, &mut decoded, &ranges);
while let Some(range) = stream.next().await {
println!("{range:?}");
}
Ok(())
}