use crate::catalog::sequence::Sequence;
use crate::diff::operations::{MigrationStep, SequenceOperation};
pub fn diff(old: Option<&Sequence>, new: Option<&Sequence>) -> Vec<MigrationStep> {
match (old, new) {
(None, Some(new_seq)) => {
let mut steps = vec![MigrationStep::Sequence(SequenceOperation::Create {
schema: new_seq.schema.clone(),
name: new_seq.name.clone(),
data_type: new_seq.data_type.clone(),
start_value: new_seq.start_value,
min_value: new_seq.min_value,
max_value: new_seq.max_value,
increment: new_seq.increment,
cycle: new_seq.cycle,
})];
if let Some(owned_by) = &new_seq.owned_by {
steps.push(MigrationStep::Sequence(SequenceOperation::AlterOwnership {
schema: new_seq.schema.clone(),
name: new_seq.name.clone(),
owned_by: owned_by.clone(),
}));
}
steps
}
(Some(old_seq), None) => {
vec![MigrationStep::Sequence(SequenceOperation::Drop {
schema: old_seq.schema.clone(),
name: old_seq.name.clone(),
})]
}
(Some(old_seq), Some(new_seq)) => {
let mut steps = Vec::new();
if old_seq.owned_by != new_seq.owned_by {
let owned_by = new_seq.owned_by.as_deref().unwrap_or("NONE");
steps.push(MigrationStep::Sequence(SequenceOperation::AlterOwnership {
schema: new_seq.schema.clone(),
name: new_seq.name.clone(),
owned_by: owned_by.to_string(),
}));
}
steps
}
(None, None) => vec![],
}
}