reinhardt_query/query/schema/
drop_schema.rs1use crate::{
6 backend::QueryBuilder,
7 types::{DynIden, IntoIden},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12#[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 pub fn new() -> Self {
53 Self {
54 schema_name: None,
55 if_exists: false,
56 cascade: false,
57 }
58 }
59
60 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 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 pub fn if_exists(&mut self) -> &mut Self {
102 self.if_exists = true;
103 self
104 }
105
106 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 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}