specfold_core/import/
map.rs1use anyhow::{Context, Result};
5use serde::{Deserialize, Serialize};
6use std::collections::BTreeMap;
7use std::path::Path;
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(deny_unknown_fields)]
11pub struct ImportMap {
12 #[serde(default)]
13 pub sources: Vec<SourceRule>,
14 #[serde(default)]
16 pub status: BTreeMap<String, String>,
17 #[serde(default)]
19 pub keys: BTreeMap<String, String>,
20}
21
22#[derive(Debug, Clone, Deserialize, Serialize)]
23#[serde(deny_unknown_fields)]
24pub struct SourceRule {
25 pub glob: String,
27 #[serde(default)]
28 pub exclude: Vec<String>,
29 #[serde(rename = "type")]
31 pub ty: Option<String>,
32 #[serde(default = "auto")]
34 pub owner: String,
35 #[serde(default = "first_commit")]
38 pub key: String,
39 pub name: Option<String>,
41 pub default_status: Option<String>,
43 #[serde(default)]
45 pub status: BTreeMap<String, String>,
46 pub redirect: Option<String>,
49 #[serde(default)]
51 pub alias_fields: Vec<String>,
52 #[serde(default)]
54 pub sibling_dir: bool,
55}
56
57fn auto() -> String {
58 "auto".into()
59}
60
61fn first_commit() -> String {
62 "first-commit".into()
63}
64
65impl ImportMap {
66 pub fn load(path: &Path) -> Result<Self> {
67 let text = std::fs::read_to_string(path).with_context(|| format!("cannot read {}", path.display()))?;
68 toml::from_str(&text).with_context(|| format!("invalid import map {}", path.display()))
69 }
70}