taitan_orm_parser/template_parser/structs/
sql_template.rs1use crate::template_parser::structs::sql_part::SqlPart;
2use crate::template_parser::to_sql::{SqlSegment, ToSqlSegment};
3use taitan_orm_tracing::debug;
4
5#[derive(Debug, PartialEq, Clone)]
6pub struct SqlTemplate {
7 pub parts: Vec<SqlPart>,
8}
9
10impl SqlTemplate {
11 pub fn new<I>(parts: I) -> Self
12 where
13 I: IntoIterator<Item = SqlPart>,
14 {
15 Self {
16 parts: parts.into_iter().collect(),
17 }
18 }
19 pub fn parse(input: &str) -> Result<SqlTemplate, String> {
20 debug!("SqlTemplate::parse({})", input);
21 let mut parts = Vec::new();
22 let mut remainder = input;
23 loop {
24 let parse_result = SqlPart::parse(remainder);
25 if let Ok((remaining, part)) = parse_result {
26 parts.push(part);
27 remainder = remaining;
28 } else {
29 let err_msg = format!("failed to parse sql template: {}", input);
30 return Err(err_msg);
31 }
32
33 if remainder.is_empty() {
34 break;
35 }
36 }
37 Ok(SqlTemplate { parts })
38 }
39}
40
41impl ToSqlSegment for SqlTemplate {
42 fn gen_sql_segments(&self) -> Vec<SqlSegment> {
43 self.parts
44 .iter()
45 .map(|p| p.gen_sql_segments())
46 .flatten()
47 .collect()
48 }
49}