pgevolve_core/diff/
sequence_op.rs1use serde::{Deserialize, Serialize};
10
11use crate::ir::column_type::ColumnType;
12use crate::ir::sequence::SequenceOwner;
13
14use super::destructiveness::Destructiveness;
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct SequenceOpEntry {
19 pub op: SequenceOp,
21 pub destructiveness: Destructiveness,
23}
24
25#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[serde(tag = "kind", content = "value", rename_all = "snake_case")]
28pub enum SequenceOp {
29 SetIncrement(i64),
31 SetMinValue(Option<i64>),
33 SetMaxValue(Option<i64>),
35 SetCache(i64),
37 SetCycle(bool),
39 SetDataType(ColumnType),
41 SetOwnedBy(Option<SequenceOwner>),
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn set_increment_serde_round_trip() {
51 let entry = SequenceOpEntry {
52 op: SequenceOp::SetIncrement(2),
53 destructiveness: Destructiveness::Safe,
54 };
55 let json = serde_json::to_string(&entry).unwrap();
56 let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
57 assert_eq!(entry, back);
58 }
59
60 #[test]
61 fn set_data_type_serde_round_trip() {
62 let entry = SequenceOpEntry {
63 op: SequenceOp::SetDataType(ColumnType::BigInt),
64 destructiveness: Destructiveness::RequiresApproval {
65 reason: "may overflow current value".into(),
66 },
67 };
68 let json = serde_json::to_string(&entry).unwrap();
69 let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
70 assert_eq!(entry, back);
71 }
72
73 #[test]
74 fn set_owned_by_none_serde_round_trip() {
75 let entry = SequenceOpEntry {
76 op: SequenceOp::SetOwnedBy(None),
77 destructiveness: Destructiveness::Safe,
78 };
79 let json = serde_json::to_string(&entry).unwrap();
80 let back: SequenceOpEntry = serde_json::from_str(&json).unwrap();
81 assert_eq!(entry, back);
82 }
83}