use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::Path;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct ImportMap {
#[serde(default)]
pub sources: Vec<SourceRule>,
#[serde(default)]
pub status: BTreeMap<String, String>,
#[serde(default)]
pub keys: BTreeMap<String, String>,
#[serde(default)]
pub stem_aliases: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct SourceRule {
pub glob: String,
#[serde(default)]
pub exclude: Vec<String>,
#[serde(rename = "type")]
pub ty: Option<String>,
#[serde(default = "auto")]
pub owner: String,
#[serde(default = "first_commit")]
pub key: String,
pub name: Option<String>,
pub default_status: Option<String>,
#[serde(default)]
pub status: BTreeMap<String, String>,
pub redirect: Option<String>,
#[serde(default)]
pub alias_fields: Vec<String>,
#[serde(default)]
pub sibling_dir: bool,
#[serde(default)]
pub wrap: bool,
#[serde(default)]
pub drop: bool,
}
fn auto() -> String {
"auto".into()
}
fn first_commit() -> String {
"first-commit".into()
}
impl ImportMap {
pub fn load(path: &Path) -> Result<Self> {
let text = std::fs::read_to_string(path).with_context(|| format!("cannot read {}", path.display()))?;
toml::from_str(&text).with_context(|| format!("invalid import map {}", path.display()))
}
}