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)
}