Skip to main content

schema_sql_generator/common/
other_sql_generator.rs

1use crate::common::generator_context::GeneratorContext;
2use crate::common::sql_writer::SqlWriter;
3use schema_model::model::types::OtherSqlOrder;
4
5pub trait OtherSqlGenerator {
6    fn output_other_sql_top(&self);
7    fn output_other_sql_bottom(&self);
8    fn output_other_sql(&self, writer: &mut SqlWriter, statement_separator: &str, sql: &str);
9}
10
11pub struct DefaultOtherSqlGenerator {
12    context: GeneratorContext,
13}
14
15impl DefaultOtherSqlGenerator {
16    pub fn new(context: GeneratorContext) -> Self {
17        Self { context }
18    }
19
20    pub fn context(&self) -> &GeneratorContext {
21        &self.context
22    }
23}
24
25impl OtherSqlGenerator for DefaultOtherSqlGenerator {
26    fn output_other_sql_top(&self) {
27        let database_type = self.context.settings().database_type();
28        let statement_separator = self.context.settings().statement_separator();
29        let database_model = self.context.settings().database_model();
30
31        self.context.with_writer(|writer| {
32            database_model.schemas().iter().for_each(|schema| {
33                schema
34                    .other_sql()
35                    .iter()
36                    .filter(|sql| sql.database_type() == database_type)
37                    .filter(|sql| sql.order() == OtherSqlOrder::Top)
38                    .filter(|sql| !sql.sql().is_empty())
39                    .for_each(|sql| {
40                        self.output_other_sql(writer, statement_separator, sql.sql());
41                    })
42            });
43        });
44    }
45
46    fn output_other_sql_bottom(&self) {
47        let database_type = self.context.settings().database_type();
48        let statement_separator = self.context.settings().statement_separator();
49        let database_model = self.context.settings().database_model();
50
51        self.context.with_writer(|writer| {
52            database_model.schemas().iter().for_each(|schema| {
53                schema
54                    .other_sql()
55                    .iter()
56                    .filter(|sql| sql.database_type() == database_type)
57                    .filter(|sql| sql.order() == OtherSqlOrder::Bottom)
58                    .filter(|sql| !sql.sql().is_empty())
59                    .for_each(|sql| {
60                        self.output_other_sql(writer, statement_separator, sql.sql());
61                    })
62            });
63        });
64    }
65
66    fn output_other_sql(&self, writer: &mut SqlWriter, statement_separator: &str, sql: &str) {
67        writer.print(sql);
68        writer.println(statement_separator);
69        writer.newline();
70    }
71}