foundry_conventions/
lib.rs1use 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}