reinhardt_query/dcl/drop_role.rs
1//! DROP ROLE statement builder
2//!
3//! # Examples
4//!
5//! ```
6//! use reinhardt_query::dcl::DropRoleStatement;
7//!
8//! let stmt = DropRoleStatement::new()
9//! .role("app_user")
10//! .if_exists(true);
11//! ```
12
13/// DROP ROLE statement builder
14///
15/// # Examples
16///
17/// ```
18/// use reinhardt_query::dcl::DropRoleStatement;
19///
20/// let stmt = DropRoleStatement::new()
21/// .roles(vec!["user1".to_string(), "user2".to_string()])
22/// .if_exists(true);
23/// ```
24#[derive(Debug, Clone, Default)]
25pub struct DropRoleStatement {
26 /// Role names to drop
27 pub role_names: Vec<String>,
28 /// IF EXISTS clause
29 pub if_exists: bool,
30}
31
32impl DropRoleStatement {
33 /// Create a new empty DROP ROLE statement
34 ///
35 /// # Examples
36 ///
37 /// ```
38 /// use reinhardt_query::dcl::DropRoleStatement;
39 ///
40 /// let stmt = DropRoleStatement::new();
41 /// ```
42 pub fn new() -> Self {
43 Self::default()
44 }
45
46 /// Add a single role name to drop
47 ///
48 /// # Examples
49 ///
50 /// ```
51 /// use reinhardt_query::dcl::DropRoleStatement;
52 ///
53 /// let stmt = DropRoleStatement::new()
54 /// .role("app_user");
55 /// ```
56 pub fn role(mut self, name: impl Into<String>) -> Self {
57 self.role_names.push(name.into());
58 self
59 }
60
61 /// Set all role names to drop at once
62 ///
63 /// # Examples
64 ///
65 /// ```
66 /// use reinhardt_query::dcl::DropRoleStatement;
67 ///
68 /// let stmt = DropRoleStatement::new()
69 /// .roles(vec!["user1".to_string(), "user2".to_string()]);
70 /// ```
71 pub fn roles(mut self, names: Vec<String>) -> Self {
72 self.role_names = names;
73 self
74 }
75
76 /// Set the IF EXISTS flag
77 ///
78 /// # Examples
79 ///
80 /// ```
81 /// use reinhardt_query::dcl::DropRoleStatement;
82 ///
83 /// let stmt = DropRoleStatement::new()
84 /// .role("app_user")
85 /// .if_exists(true);
86 /// ```
87 pub fn if_exists(mut self, flag: bool) -> Self {
88 self.if_exists = flag;
89 self
90 }
91
92 /// Validate the DROP ROLE statement
93 ///
94 /// # Validation Rules
95 ///
96 /// 1. At least one role name is required
97 ///
98 /// # Examples
99 ///
100 /// Valid statement:
101 /// ```
102 /// use reinhardt_query::dcl::DropRoleStatement;
103 ///
104 /// let stmt = DropRoleStatement::new()
105 /// .role("app_user");
106 ///
107 /// assert!(stmt.validate().is_ok());
108 /// ```
109 ///
110 /// Invalid statement (no role names):
111 /// ```
112 /// use reinhardt_query::dcl::DropRoleStatement;
113 ///
114 /// let stmt = DropRoleStatement::new();
115 /// assert!(stmt.validate().is_err());
116 /// ```
117 pub fn validate(&self) -> Result<(), String> {
118 if self.role_names.is_empty() {
119 return Err("At least one role name is required".to_string());
120 }
121 // Validate each role name is non-empty after trimming whitespace
122 for (idx, role_name) in self.role_names.iter().enumerate() {
123 let trimmed = role_name.trim();
124 if trimmed.is_empty() {
125 return Err(format!(
126 "Role name at index {} cannot be empty or whitespace only",
127 idx
128 ));
129 }
130 }
131 Ok(())
132 }
133}