mercur 0.1.5

mercur - junolang package manager
use std::path::Path;

use anyhow::anyhow;
use tokio::{
    fs::{self, File},
    io::AsyncWriteExt,
};

// compiles the registry
mod authority;
mod bloom;
mod compile_registry;
mod hash;
mod metadata;
mod model;
mod namespace;
mod optimize;
mod package;
mod package_index;
mod parse;
mod version;

pub use version::SemVersion;

use crate::registry::schema::registry::root_as_registry;

pub async fn proj2fb(proj_path: &Path, out_path: &Path) -> anyhow::Result<()> {
    if !proj_path.is_dir() {
        return Err(anyhow!("Path is not a directory"));
    }

    let binding = proj_path.join("authorities");
    let authority_dir = binding.as_path();
    let binding = proj_path.join("namespaces");
    let namespace_dir = binding.as_path();
    let binding = proj_path.join("pkgs");
    let pkg_dir = binding.as_path();

    let mut authority_files = vec![];
    if authority_dir.exists() {
        for i in authority_dir.read_dir()? {
            authority_files.push(i?.path())
        }
    }
    let mut namespace_files = vec![];
    if namespace_dir.exists() {
        for i in namespace_dir.read_dir()? {
            namespace_files.push(i?.path())
        }
    }

    let mut pkg_files = vec![];
    if pkg_dir.exists() {
        for i in pkg_dir.read_dir()? {
            pkg_files.push(i?.path())
        }
    }
    let authority_files: Vec<&Path> = authority_files.iter().map(|x| x.as_path()).collect();
    let namespace_files: Vec<&Path> = namespace_files.iter().map(|x| x.as_path()).collect();
    let pkg_files: Vec<&Path> = pkg_files.iter().map(|x| x.as_path()).collect();

    let binding = parse::parse_authority_toml_files(authority_files).await?;
    let authorities_parsed: Vec<&parse::AuthorityDefinition> = binding.iter().collect();

    let binding = parse::parse_namespace_toml_files(namespace_files).await?;
    let namespaces_parsed: Vec<&parse::NamespaceDefinition> = binding.iter().collect();

    let binding = parse::parse_pkg_toml_files(pkg_files).await?;
    let pkgs_parsed: Vec<&parse::PkgDefinition> = binding.iter().collect();

    let registry =
        compile_registry::compile_registry(authorities_parsed, namespaces_parsed, pkgs_parsed);

    let _ = fs::create_dir_all(out_path).await;

    File::create(out_path.join("registry.mreg"))
        .await?
        .write_buf(&mut registry.as_slice())
        .await?;

    Ok(())
}