Skip to main content

toolu_orm_core/diff/
enums.rs

1//! Enum type diff detection between snapshots.
2
3use 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}