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();
let metadata = compile_metadata(&mut builder);
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));
}
let package_index = compile_package_index(&mut builder, &pkgs);
let authority_offsets = authorities
.iter()
.map(|a| compile_authority(&mut builder, a))
.collect::<Vec<_>>();
let authorities = builder.create_vector(&authority_offsets);
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()
}