taitan_orm_parser/template_parser/structs/
sql_template.rs

1use 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}