mercur 0.1.6

mercur - junolang package manager
use flatbuffers::FlatBufferBuilder;

use crate::registry::compile::{
    authority::compile_authority,
    bloom::{build_bloom, compile_bloom},
    metadata::compile_metadata,
    package::compile_pkg_registry_entry,
    package_index::compile_package_index,
    parse::{
        AuthorityDefinition as AuthorityTomlDefinition,
        NamespaceDefinition as NamespaceTomlDefinition, PkgDefinition as PkgTomlDefinition,
    },
};

use crate::registry::schema::registry::{Registry, RegistryArgs};

pub fn compile_registry(
    authorities: Vec<&AuthorityTomlDefinition>,
    _namespaces: Vec<&NamespaceTomlDefinition>,
    pkgs: Vec<&PkgTomlDefinition>,
) -> Vec<u8> {
    let mut builder = FlatBufferBuilder::new();

    //
    // Metadata
    //

    let metadata = compile_metadata(&mut builder);

    //
    // Bloom filter
    //

    let bloom_runtime = build_bloom(&pkgs);
    let mut bloom = None;
    if let Some(bloom_runtime) = bloom_runtime {
        bloom = Some(compile_bloom(&mut builder, bloom_runtime));
    }

    //
    // Package index
    //

    let package_index = compile_package_index(&mut builder, &pkgs);

    //
    // Authorities
    //

    let authority_offsets = authorities
        .iter()
        .map(|a| compile_authority(&mut builder, a))
        .collect::<Vec<_>>();

    let authorities = builder.create_vector(&authority_offsets);

    //
    // Packages
    //

    let package_offsets = pkgs
        .iter()
        .map(|p| compile_pkg_registry_entry(&mut builder, p))
        .collect::<Vec<_>>();

    let packages = builder.create_vector(&package_offsets);

    let root = Registry::create(
        &mut builder,
        &RegistryArgs {
            metadata: Some(metadata),

            bloom: bloom,

            package_index: Some(package_index),

            namespace_routes: None,

            authorities: Some(authorities),

            packages: Some(packages),
        },
    );

    builder.finish(root, None);

    builder.finished_data().to_vec()
}