Skip to main content

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}