mercur 0.1.4

mercur - junolang package manager
use crate::registry::compile::{
    hash::{authority_id, namespace_id, package_id},
    model::RegistryModel,
    version::sort_versions,
};

/// Performs all compile-time optimizations.
///
/// This function mutates the intermediate model before it is
/// serialized into FlatBuffers.
pub fn optimize(model: &mut RegistryModel) {
    //
    // ---------------------------
    // Packages
    // ---------------------------
    //

    model
        .packages
        .sort_by_key(|pkg| package_id(&pkg.metadata.name));

    for pkg in &mut model.packages {
        sort_versions(&mut pkg.versions);
    }

    //
    // ---------------------------
    // Authorities
    // ---------------------------
    //

    model
        .authorities
        .sort_by_key(|authority| authority_id(&authority.metadata.id));

    //
    // Registries
    //

    for authority in &mut model.authorities {
        authority
            .registries
            .sort_by_key(|registry| namespace_id(&registry.namespace));

        //
        // History newest first
        //

        authority.registries.iter_mut().for_each(|registry| {
            registry.history.sort_by(|a, b| b.until.cmp(&a.until));
        });
    }

    //
    // ---------------------------
    // Namespaces
    // ---------------------------
    //

    model
        .namespaces
        .sort_by_key(|namespace| namespace_id(&namespace.metadata.id));
}