use serde::{Deserialize, Serialize};
use crate::ir::column_type::ColumnType;
use crate::ir::sequence::SequenceOwner;
use super::destructiveness::Destructiveness;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SequenceOpEntry {
pub op: SequenceOp,
pub destructiveness: Destructiveness,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
pub enum SequenceOp {
SetIncrement(i64),
SetMinValue(Option<i64>),
SetMaxValue(Option<i64>),
SetCache(i64),
SetCycle(bool),
SetDataType(ColumnType),
SetOwnedBy(Option<SequenceOwner>),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn set_increment_serde_round_trip() {
let entry = SequenceOpEntry {
op: SequenceOp::SetIncrement(2),
destructiveness: Destructiveness::Safe,
};
let json = serde_json::to_string(&entry).unwrap();
let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
assert_eq!(entry, back);
}
#[test]
fn set_data_type_serde_round_trip() {
let entry = SequenceOpEntry {
op: SequenceOp::SetDataType(ColumnType::BigInt),
destructiveness: Destructiveness::RequiresApproval {
reason: "may overflow current value".into(),
},
};
let json = serde_json::to_string(&entry).unwrap();
let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
assert_eq!(entry, back);
}
#[test]
fn set_owned_by_none_serde_round_trip() {
let entry = SequenceOpEntry {
op: SequenceOp::SetOwnedBy(None),
destructiveness: Destructiveness::Safe,
};
let json = serde_json::to_string(&entry).unwrap();
let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
assert_eq!(entry, back);
}
}