Skip to main content

reinhardt_query/query/schema/
drop_schema.rs

1//! DROP SCHEMA statement builder
2//!
3//! This module provides the `DropSchemaStatement` type for building SQL DROP SCHEMA queries.
4
5use crate::{
6	backend::QueryBuilder,
7	types::{DynIden, IntoIden},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12/// DROP SCHEMA statement builder
13///
14/// This struct provides a fluent API for constructing DROP SCHEMA queries.
15///
16/// # Examples
17///
18/// ```rust
19/// use reinhardt_query::prelude::*;
20///
21/// // DROP SCHEMA my_schema
22/// let query = Query::drop_schema()
23///     .name("my_schema");
24///
25/// // DROP SCHEMA IF EXISTS my_schema
26/// let query = Query::drop_schema()
27///     .name("my_schema")
28///     .if_exists();
29///
30/// // DROP SCHEMA my_schema CASCADE
31/// let query = Query::drop_schema()
32///     .name("my_schema")
33///     .cascade();
34/// ```
35#[derive(Debug, Clone)]
36pub struct DropSchemaStatement {
37	pub(crate) schema_name: Option<DynIden>,
38	pub(crate) if_exists: bool,
39	pub(crate) cascade: bool,
40}
41
42impl DropSchemaStatement {
43	/// Create a new DROP SCHEMA statement
44	///
45	/// # Examples
46	///
47	/// ```rust
48	/// use reinhardt_query::prelude::*;
49	///
50	/// let query = Query::drop_schema();
51	/// ```
52	pub fn new() -> Self {
53		Self {
54			schema_name: None,
55			if_exists: false,
56			cascade: false,
57		}
58	}
59
60	/// Take the ownership of data in the current [`DropSchemaStatement`]
61	pub fn take(&mut self) -> Self {
62		let taken = Self {
63			schema_name: self.schema_name.take(),
64			if_exists: self.if_exists,
65			cascade: self.cascade,
66		};
67		self.if_exists = false;
68		self.cascade = false;
69		taken
70	}
71
72	/// Set the schema name
73	///
74	/// # Examples
75	///
76	/// ```rust
77	/// use reinhardt_query::prelude::*;
78	///
79	/// let query = Query::drop_schema()
80	///     .name("my_schema");
81	/// ```
82	pub fn name<N>(&mut self, name: N) -> &mut Self
83	where
84		N: IntoIden,
85	{
86		self.schema_name = Some(name.into_iden());
87		self
88	}
89
90	/// Add IF EXISTS clause
91	///
92	/// # Examples
93	///
94	/// ```rust
95	/// use reinhardt_query::prelude::*;
96	///
97	/// let query = Query::drop_schema()
98	///     .name("my_schema")
99	///     .if_exists();
100	/// ```
101	pub fn if_exists(&mut self) -> &mut Self {
102		self.if_exists = true;
103		self
104	}
105
106	/// Add CASCADE clause
107	///
108	/// # Examples
109	///
110	/// ```rust
111	/// use reinhardt_query::prelude::*;
112	///
113	/// let query = Query::drop_schema()
114	///     .name("my_schema")
115	///     .cascade();
116	/// ```
117	pub fn cascade(&mut self) -> &mut Self {
118		self.cascade = true;
119		self
120	}
121}
122
123impl Default for DropSchemaStatement {
124	fn default() -> Self {
125		Self::new()
126	}
127}
128
129impl QueryStatementBuilder for DropSchemaStatement {
130	fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
131		// Downcast to concrete QueryBuilder type
132		use std::any::Any;
133		if let Some(builder) =
134			(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
135		{
136			return builder.build_drop_schema(self);
137		}
138		if let Some(builder) =
139			(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
140		{
141			return builder.build_drop_schema(self);
142		}
143		if let Some(builder) =
144			(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
145		{
146			return builder.build_drop_schema(self);
147		}
148		panic!("Unsupported query builder type");
149	}
150}
151
152impl QueryStatementWriter for DropSchemaStatement {}
153
154#[cfg(test)]
155mod tests {
156	use super::*;
157	use rstest::*;
158
159	#[rstest]
160	fn test_drop_schema_new() {
161		let stmt = DropSchemaStatement::new();
162		assert!(stmt.schema_name.is_none());
163		assert!(!stmt.if_exists);
164		assert!(!stmt.cascade);
165	}
166
167	#[rstest]
168	fn test_drop_schema_with_name() {
169		let mut stmt = DropSchemaStatement::new();
170		stmt.name("my_schema");
171		assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
172	}
173
174	#[rstest]
175	fn test_drop_schema_if_exists() {
176		let mut stmt = DropSchemaStatement::new();
177		stmt.name("my_schema").if_exists();
178		assert!(stmt.if_exists);
179	}
180
181	#[rstest]
182	fn test_drop_schema_cascade() {
183		let mut stmt = DropSchemaStatement::new();
184		stmt.name("my_schema").cascade();
185		assert!(stmt.cascade);
186	}
187
188	#[rstest]
189	fn test_drop_schema_all_options() {
190		let mut stmt = DropSchemaStatement::new();
191		stmt.name("my_schema").if_exists().cascade();
192		assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
193		assert!(stmt.if_exists);
194		assert!(stmt.cascade);
195	}
196
197	#[rstest]
198	fn test_drop_schema_take() {
199		let mut stmt = DropSchemaStatement::new();
200		stmt.name("my_schema").if_exists();
201		let taken = stmt.take();
202		assert!(stmt.schema_name.is_none());
203		assert!(!stmt.if_exists);
204		assert_eq!(taken.schema_name.as_ref().unwrap().to_string(), "my_schema");
205		assert!(taken.if_exists);
206	}
207}