mercur 0.1.5

mercur - junolang package manager
use serde::Deserialize;
use std::{collections::HashMap, io::Read, path::Path};
use tokio::{fs::File, io::AsyncReadExt};

#[derive(Debug, Deserialize)]
pub struct PkgDefinition {
    pub schema: u32,
    pub metadata: PkgMetadata,
    #[serde(rename = "version")]
    pub versions: Vec<PkgVersion>,
}

#[derive(Debug, Deserialize)]
pub struct PkgMetadata {
    pub name: String,
    pub authority: String,
    pub description: String,
    #[serde(rename = "ref")]
    pub reference: String,
}

#[derive(Debug, Deserialize)]
pub struct PkgVersion {
    pub version: String,
    pub hash: String,
    pub date: String,
    pub signature: String,
    #[serde(rename = "dep")]
    pub dependencies: HashMap<String, Dep>,
}
#[derive(Debug, Deserialize)]
pub struct Dep {
    #[serde(rename = "ref")]
    pub reference: String,
    pub authority: String,
    pub version: String,
    pub hash: String,
    pub targets: Vec<String>,
    pub signature: String,
}

fn parse_pkg_toml(input: &str) -> anyhow::Result<PkgDefinition> {
    toml::from_str(input).map_err(Into::into)
}

pub async fn parse_pkg_toml_files(files: Vec<&Path>) -> anyhow::Result<Vec<PkgDefinition>> {
    let mut r = vec![];
    for f in files {
        let buf: &mut String = &mut String::new();
        File::open(f).await?.read_to_string(buf).await?;
        r.push(parse_pkg_toml(buf.as_str())?);
    }
    Ok(r)
}