reinhardt_query/query/schema/
alter_schema.rs1use crate::{
6 backend::QueryBuilder,
7 types::{DynIden, IntoIden},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12#[derive(Debug, Clone)]
29pub enum AlterSchemaOperation {
30 RenameTo(DynIden),
32 OwnerTo(DynIden),
34}
35
36#[derive(Debug, Clone)]
56pub struct AlterSchemaStatement {
57 pub(crate) schema_name: Option<DynIden>,
58 pub(crate) operation: Option<AlterSchemaOperation>,
59}
60
61impl AlterSchemaStatement {
62 pub fn new() -> Self {
72 Self {
73 schema_name: None,
74 operation: None,
75 }
76 }
77
78 pub fn take(&mut self) -> Self {
80 Self {
81 schema_name: self.schema_name.take(),
82 operation: self.operation.take(),
83 }
84 }
85
86 pub fn name<N>(&mut self, name: N) -> &mut Self
97 where
98 N: IntoIden,
99 {
100 self.schema_name = Some(name.into_iden());
101 self
102 }
103
104 pub fn rename_to<N>(&mut self, new_name: N) -> &mut Self
116 where
117 N: IntoIden,
118 {
119 self.operation = Some(AlterSchemaOperation::RenameTo(new_name.into_iden()));
120 self
121 }
122
123 pub fn owner_to<O>(&mut self, new_owner: O) -> &mut Self
135 where
136 O: IntoIden,
137 {
138 self.operation = Some(AlterSchemaOperation::OwnerTo(new_owner.into_iden()));
139 self
140 }
141}
142
143impl Default for AlterSchemaStatement {
144 fn default() -> Self {
145 Self::new()
146 }
147}
148
149impl QueryStatementBuilder for AlterSchemaStatement {
150 fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
151 use std::any::Any;
153 if let Some(builder) =
154 (query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
155 {
156 return builder.build_alter_schema(self);
157 }
158 if let Some(builder) =
159 (query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
160 {
161 return builder.build_alter_schema(self);
162 }
163 if let Some(builder) =
164 (query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
165 {
166 return builder.build_alter_schema(self);
167 }
168 panic!("Unsupported query builder type");
169 }
170}
171
172impl QueryStatementWriter for AlterSchemaStatement {}
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177 use rstest::*;
178
179 #[rstest]
180 fn test_alter_schema_new() {
181 let stmt = AlterSchemaStatement::new();
182 assert!(stmt.schema_name.is_none());
183 assert!(stmt.operation.is_none());
184 }
185
186 #[rstest]
187 fn test_alter_schema_with_name() {
188 let mut stmt = AlterSchemaStatement::new();
189 stmt.name("my_schema");
190 assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
191 }
192
193 #[rstest]
194 fn test_alter_schema_rename_to() {
195 let mut stmt = AlterSchemaStatement::new();
196 stmt.name("old_schema").rename_to("new_schema");
197 assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "old_schema");
198 match &stmt.operation {
199 Some(AlterSchemaOperation::RenameTo(name)) => {
200 assert_eq!(name.to_string(), "new_schema");
201 }
202 _ => panic!("Expected RenameTo operation"),
203 }
204 }
205
206 #[rstest]
207 fn test_alter_schema_owner_to() {
208 let mut stmt = AlterSchemaStatement::new();
209 stmt.name("my_schema").owner_to("new_owner");
210 assert_eq!(stmt.schema_name.as_ref().unwrap().to_string(), "my_schema");
211 match &stmt.operation {
212 Some(AlterSchemaOperation::OwnerTo(owner)) => {
213 assert_eq!(owner.to_string(), "new_owner");
214 }
215 _ => panic!("Expected OwnerTo operation"),
216 }
217 }
218
219 #[rstest]
220 fn test_alter_schema_take() {
221 let mut stmt = AlterSchemaStatement::new();
222 stmt.name("my_schema").rename_to("new_schema");
223 let taken = stmt.take();
224 assert!(stmt.schema_name.is_none());
225 assert!(stmt.operation.is_none());
226 assert_eq!(taken.schema_name.as_ref().unwrap().to_string(), "my_schema");
227 match &taken.operation {
228 Some(AlterSchemaOperation::RenameTo(name)) => {
229 assert_eq!(name.to_string(), "new_schema");
230 }
231 _ => panic!("Expected RenameTo operation"),
232 }
233 }
234}