use flatbuffers::{FlatBufferBuilder, WIPOffset};
use crate::registry::compile::{
hash::{package_id, parse_hash},
parse::{PkgDefinition as PkgTomlDefinition, PkgVersion as PkgTomlVersion},
version::{SemVersion, parse_date, sort_versions},
};
use crate::registry::schema::registry::{
PkgRegistryEntry, PkgRegistryEntryArgs, RegistryRefType, Version, VersionArgs,
};
pub fn compile_pkg_registry_entry<'a>(
builder: &mut FlatBufferBuilder<'a>,
pkg: &PkgTomlDefinition,
) -> WIPOffset<PkgRegistryEntry<'a>> {
let name = builder.create_string(&pkg.metadata.name);
let reference = builder.create_string(&pkg.metadata.reference);
let versions = pkg
.versions
.iter()
.map(|v| compile_version(builder, v))
.collect::<Vec<_>>();
let versions = builder.create_vector(&versions);
let authority = builder.create_string(&pkg.metadata.authority);
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());
let id = xxh3_64(&key);
PkgRegistryEntry::create(
builder,
&PkgRegistryEntryArgs {
id,
name: Some(name),
authority: Some(authority),
ref_type: RegistryRefType::NoRef,
ref_: Some(reference),
versions: Some(versions),
},
)
}
fn compile_version<'a>(
builder: &mut FlatBufferBuilder<'a>,
version: &PkgTomlVersion,
) -> WIPOffset<Version<'a>> {
let semver = SemVersion::parse(&version.version);
let tag = semver.tag.as_ref().map(|t| builder.create_string(t));
let hash = parse_hash(&version.hash);
Version::create(
builder,
&VersionArgs {
major: semver.major,
minor: semver.minor,
patch: semver.patch,
tag,
hash: Some(&hash),
date: parse_date(&version.date),
},
)
}
use xxhash_rust::xxh3::xxh3_64;