vtcode_config/loader/
layers.rs1use crate::loader::merge_toml_values;
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4use toml::Value as TomlValue;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub enum ConfigLayerSource {
9 System { file: PathBuf },
11 User { file: PathBuf },
13 Project { file: PathBuf },
15 Workspace { file: PathBuf },
17 Runtime,
19}
20
21#[derive(Debug, Clone, PartialEq)]
23pub struct ConfigLayerEntry {
24 pub source: ConfigLayerSource,
26 pub config: TomlValue,
28}
29
30impl ConfigLayerEntry {
31 pub fn new(source: ConfigLayerSource, config: TomlValue) -> Self {
33 Self { source, config }
34 }
35}
36
37#[derive(Debug, Clone, Default)]
39pub struct ConfigLayerStack {
40 layers: Vec<ConfigLayerEntry>,
41}
42
43impl ConfigLayerStack {
44 pub fn new(layers: Vec<ConfigLayerEntry>) -> Self {
46 Self { layers }
47 }
48
49 pub fn push(&mut self, layer: ConfigLayerEntry) {
51 self.layers.push(layer);
52 }
53
54 pub fn effective_config(&self) -> TomlValue {
56 let mut merged = TomlValue::Table(toml::Table::new());
57 for layer in &self.layers {
58 merge_toml_values(&mut merged, &layer.config);
59 }
60 merged
61 }
62
63 pub fn layers(&self) -> &[ConfigLayerEntry] {
65 &self.layers
66 }
67}