toolu_orm_core/diff/
enums.rs1use std::collections::BTreeSet;
4
5use crate::snapshot::Snapshot;
6
7use super::operation::Operation;
8
9pub fn diff_enums(old: &Snapshot, new: &Snapshot) -> Vec<Operation> {
10 let mut ops = Vec::new();
11
12 for name in old.enums.keys() {
13 if !new.enums.contains_key(name) {
14 ops.push(Operation::DropEnum { name: name.clone() });
15 }
16 }
17
18 for (name, new_enum) in &new.enums {
19 let Some(old_enum) = old.enums.get(name) else {
20 ops.push(Operation::CreateEnum {
21 name: name.clone(),
22 variants: new_enum.variants.clone(),
23 });
24 continue;
25 };
26
27 let old_v: BTreeSet<_> = old_enum.variants.iter().cloned().collect();
28 let new_v: BTreeSet<_> = new_enum.variants.iter().cloned().collect();
29
30 let added: Vec<String> = new_v.difference(&old_v).cloned().collect();
31 let removed: Vec<String> = old_v.difference(&new_v).cloned().collect();
32
33 if !added.is_empty() || !removed.is_empty() {
34 ops.push(Operation::AlterEnum {
35 name: name.clone(),
36 added,
37 removed,
38 });
39 }
40 }
41
42 ops
43}