use crate::types::event::{EventCompletion, EventOperation, EventSchedule};
use crate::types::{DynIden, IntoIden};
#[derive(Debug, Clone)]
pub struct AlterEventStatement {
pub(crate) name: Option<DynIden>,
pub(crate) operations: Vec<EventOperation>,
}
impl AlterEventStatement {
pub fn new() -> Self {
Self {
name: None,
operations: Vec::new(),
}
}
pub fn name<N: IntoIden>(&mut self, name: N) -> &mut Self {
self.name = Some(name.into_iden());
self
}
pub fn rename_to<N: IntoIden>(&mut self, new_name: N) -> &mut Self {
self.operations
.push(EventOperation::RenameTo(new_name.into_iden()));
self
}
pub fn on_schedule_at<T: Into<String>>(&mut self, timestamp: T) -> &mut Self {
self.operations
.push(EventOperation::OnSchedule(EventSchedule::At {
timestamp: timestamp.into(),
}));
self
}
pub fn on_schedule_every<I: Into<String>>(&mut self, interval: I) -> &mut Self {
self.operations
.push(EventOperation::OnSchedule(EventSchedule::Every {
interval: interval.into(),
starts: None,
ends: None,
}));
self
}
pub fn on_completion_preserve(&mut self) -> &mut Self {
self.operations
.push(EventOperation::OnCompletion(EventCompletion::Preserve));
self
}
pub fn on_completion_not_preserve(&mut self) -> &mut Self {
self.operations
.push(EventOperation::OnCompletion(EventCompletion::NotPreserve));
self
}
pub fn enable(&mut self) -> &mut Self {
self.operations.push(EventOperation::Enable);
self
}
pub fn disable(&mut self) -> &mut Self {
self.operations.push(EventOperation::Disable);
self
}
pub fn comment<C: Into<String>>(&mut self, comment: C) -> &mut Self {
self.operations
.push(EventOperation::Comment(comment.into()));
self
}
}
impl Default for AlterEventStatement {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
#[rstest]
fn test_alter_event_new() {
let stmt = AlterEventStatement::new();
assert!(stmt.name.is_none());
assert!(stmt.operations.is_empty());
}
#[rstest]
fn test_alter_event_name() {
let mut stmt = AlterEventStatement::new();
stmt.name("my_event");
assert_eq!(stmt.name.as_ref().unwrap().to_string(), "my_event");
}
#[rstest]
fn test_alter_event_rename_to() {
let mut stmt = AlterEventStatement::new();
stmt.rename_to("new_event");
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(&stmt.operations[0], EventOperation::RenameTo(_)));
}
#[rstest]
fn test_alter_event_on_schedule_at() {
let mut stmt = AlterEventStatement::new();
stmt.on_schedule_at("2026-12-31 23:59:59");
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(
&stmt.operations[0],
EventOperation::OnSchedule(EventSchedule::At { .. })
));
}
#[rstest]
fn test_alter_event_on_schedule_every() {
let mut stmt = AlterEventStatement::new();
stmt.on_schedule_every("2 HOUR");
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(
&stmt.operations[0],
EventOperation::OnSchedule(EventSchedule::Every { .. })
));
}
#[rstest]
fn test_alter_event_on_completion_preserve() {
let mut stmt = AlterEventStatement::new();
stmt.on_completion_preserve();
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(
&stmt.operations[0],
EventOperation::OnCompletion(EventCompletion::Preserve)
));
}
#[rstest]
fn test_alter_event_on_completion_not_preserve() {
let mut stmt = AlterEventStatement::new();
stmt.on_completion_not_preserve();
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(
&stmt.operations[0],
EventOperation::OnCompletion(EventCompletion::NotPreserve)
));
}
#[rstest]
fn test_alter_event_enable() {
let mut stmt = AlterEventStatement::new();
stmt.enable();
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(&stmt.operations[0], EventOperation::Enable));
}
#[rstest]
fn test_alter_event_disable() {
let mut stmt = AlterEventStatement::new();
stmt.disable();
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(&stmt.operations[0], EventOperation::Disable));
}
#[rstest]
fn test_alter_event_comment() {
let mut stmt = AlterEventStatement::new();
stmt.comment("Updated comment");
assert_eq!(stmt.operations.len(), 1);
assert!(matches!(&stmt.operations[0], EventOperation::Comment(_)));
}
#[rstest]
fn test_alter_event_multiple_operations() {
let mut stmt = AlterEventStatement::new();
stmt.name("my_event")
.on_schedule_every("2 HOUR")
.on_completion_preserve()
.enable()
.comment("Updated");
assert_eq!(stmt.name.as_ref().unwrap().to_string(), "my_event");
assert_eq!(stmt.operations.len(), 4);
assert!(matches!(
&stmt.operations[0],
EventOperation::OnSchedule(EventSchedule::Every { .. })
));
assert!(matches!(
&stmt.operations[1],
EventOperation::OnCompletion(EventCompletion::Preserve)
));
assert!(matches!(&stmt.operations[2], EventOperation::Enable));
assert!(matches!(&stmt.operations[3], EventOperation::Comment(_)));
}
}