Skip to main content

source_vmt/
patch.rs

1use crate::vmt::Vmt;
2use crate::interner::intern_key;
3use source_kv::Value;
4
5impl Vmt {
6    /// Applies patch instructions (insert/replace) to this VMT.
7    pub fn apply_patch(&mut self, patch: &Vmt) {
8        // Handle 'replace'
9        if let Some(Value::Obj(replace_map)) = patch.get_raw("replace") {
10            for (k, v) in replace_map {
11                self.properties.insert(intern_key(k), v.clone());
12            }
13        }
14        
15        // Handle 'insert'
16        if let Some(Value::Obj(insert_map)) = patch.get_raw("insert") {
17            for (k, v) in insert_map {
18                self.properties.insert(intern_key(k), v.clone());
19            }
20        }
21
22        // Cleanup patch-specific keys from the final VMT
23        self.properties.shift_remove(&intern_key("insert"));
24        self.properties.shift_remove(&intern_key("replace"));
25        self.properties.shift_remove(&intern_key("include"));
26        self.properties.shift_remove(&intern_key("$include"));
27    }
28}