Skip to main content

foundry_conventions/
lib.rs

1use foundry_schema::{merge, FoundryConfig, PartialConfig};
2use foundry_types::DecisionTrace;
3
4#[derive(Debug, Clone, Default)]
5pub struct ConfigLayers {
6    pub profile: PartialConfig,
7    pub project: PartialConfig,
8    pub companion: PartialConfig,
9    pub explicit: PartialConfig,
10}
11
12pub fn resolve_config(layers: ConfigLayers) -> (FoundryConfig, Vec<DecisionTrace>) {
13    let mut cfg = FoundryConfig::default();
14    let mut traces = vec![DecisionTrace {
15        field: "all".into(),
16        source: "built_in_defaults".into(),
17        value: format!("{}:{}", cfg.archetype, cfg.profile),
18    }];
19
20    cfg = merge(&cfg, &layers.profile);
21    append_trace(&mut traces, "profile_defaults", &cfg);
22
23    cfg = merge(&cfg, &layers.project);
24    append_trace(&mut traces, "project_foundry_toml", &cfg);
25
26    cfg = merge(&cfg, &layers.companion);
27    append_trace(&mut traces, "companion_toml", &cfg);
28
29    cfg = merge(&cfg, &layers.explicit);
30    append_trace(&mut traces, "explicit_input", &cfg);
31
32    (cfg, traces)
33}
34
35fn append_trace(traces: &mut Vec<DecisionTrace>, source: &str, cfg: &FoundryConfig) {
36    traces.push(DecisionTrace {
37        field: "project_name".into(),
38        source: source.into(),
39        value: cfg.project_name.clone(),
40    });
41    traces.push(DecisionTrace {
42        field: "archetype".into(),
43        source: source.into(),
44        value: cfg.archetype.to_string(),
45    });
46    traces.push(DecisionTrace {
47        field: "template_engine".into(),
48        source: source.into(),
49        value: format!("{:?}", cfg.template_engine),
50    });
51    traces.push(DecisionTrace {
52        field: "profile".into(),
53        source: source.into(),
54        value: cfg.profile.clone(),
55    });
56    traces.push(DecisionTrace {
57        field: "run_post_gen_checks".into(),
58        source: source.into(),
59        value: cfg.run_post_gen_checks.to_string(),
60    });
61}