mercur 0.1.3

mercur - junolang package manager
use flatbuffers::{FlatBufferBuilder, WIPOffset};

use crate::registry::compile::{hash::package_id, parse::PkgDefinition as PkgTomlDefinition};

use crate::registry::schema::registry::{PackageIndexEntry, PackageIndexEntryArgs};

/// Builds the PackageIndex.
///
/// Assumes that `packages` are already sorted (optimize.rs).
use xxhash_rust::xxh3::xxh3_64;

pub fn compile_package_index<'a>(
    builder: &mut FlatBufferBuilder<'a>,
    pkgs: &[&PkgTomlDefinition],
) -> flatbuffers::WIPOffset<
    flatbuffers::Vector<'a, flatbuffers::ForwardsUOffset<PackageIndexEntry<'a>>>,
> {
    let mut entries: Vec<(u64, u32)> = pkgs
        .iter()
        .enumerate()
        .map(|(index, pkg)| {
            let mut key =
                Vec::with_capacity(pkg.metadata.authority.len() + pkg.metadata.name.len() + 1);

            key.extend_from_slice(pkg.metadata.authority.as_bytes());
            key.push(b'#');
            key.extend_from_slice(pkg.metadata.name.as_bytes());

            (xxh3_64(&key), index as u32)
        })
        .collect();

    entries.sort_unstable_by_key(|x| x.0);

    let offsets = entries
        .into_iter()
        .map(|(id, package)| {
            PackageIndexEntry::create(builder, &PackageIndexEntryArgs { id, package })
        })
        .collect::<Vec<_>>();

    builder.create_vector(&offsets)
}