use std::path::Path;
use super::super::Result;
pub(super) struct BlobTask {
pub(super) seq: usize,
pub(super) data_offset: u64,
pub(super) data_size: usize,
pub(super) element_count: u64,
pub(super) max_id: i64,
pub(super) bbox: Option<crate::blob_meta::BlobBbox>,
}
#[hotpath::measure]
pub(super) fn build_all_blob_schedules(
input: &Path,
) -> Result<(Vec<BlobTask>, Vec<BlobTask>, Vec<BlobTask>)> {
let mut walker = crate::read::header_walker::HeaderWalker::open(input)?;
let _ = walker
.next_header()?
.ok_or_else(|| crate::error::new_error(crate::error::ErrorKind::MissingHeader))?;
let mut nodes: Vec<BlobTask> = Vec::new();
let mut ways: Vec<BlobTask> = Vec::new();
let mut relations: Vec<BlobTask> = Vec::new();
let mut node_seq: usize = 0;
let mut way_seq: usize = 0;
let mut rel_seq: usize = 0;
while let Some(meta) = walker.next_header()? {
if !matches!(meta.blob_type, crate::blob::BlobKind::OsmData) {
continue;
}
let Some(idx) = meta.index else {
return Err(
"renumber requires an indexed PBF - run `pbfhogg cat` to add \
indexdata or use the indexed variant"
.into(),
);
};
let (sched, seq) = match idx.kind {
crate::blob_meta::ElemKind::Node => (&mut nodes, &mut node_seq),
crate::blob_meta::ElemKind::Way => (&mut ways, &mut way_seq),
crate::blob_meta::ElemKind::Relation => (&mut relations, &mut rel_seq),
};
sched.push(BlobTask {
seq: *seq,
data_offset: meta.data_offset,
data_size: meta.data_size,
element_count: idx.count,
max_id: idx.max_id,
bbox: idx.bbox,
});
*seq += 1;
}
Ok((nodes, ways, relations))
}