taitan-orm-parser 0.1.10

Next Generation ORM based on sqlx
Documentation
use crate::template_parser::structs::sql_part::SqlPart;
use crate::template_parser::to_sql::{SqlSegment, ToSqlSegment};
use tracing::debug;

#[derive(Debug, PartialEq, Clone)]
pub struct SqlTemplate {
    pub parts: Vec<SqlPart>,
}

impl SqlTemplate {
    pub fn new<I>(parts: I) -> Self
    where
        I: IntoIterator<Item = SqlPart>,
    {
        Self {
            parts: parts.into_iter().collect(),
        }
    }
    pub fn parse(input: &str) -> Result<SqlTemplate, String> {
        debug!("SqlTemplate::parse({})", input);
        let mut parts = Vec::new();
        let mut remainder = input;
        loop {
            let parse_result = SqlPart::parse(remainder);
            if let Ok((remaining, part)) = parse_result {
                parts.push(part);
                remainder = remaining;
            } else {
                let err_msg = format!("failed to parse sql template: {}", input);
                return Err(err_msg);
            }

            if remainder.is_empty() {
                break;
            }
        }
        Ok(SqlTemplate { parts })
    }
}

impl ToSqlSegment for SqlTemplate {
    fn gen_sql_segments(&self) -> Vec<SqlSegment> {
        self.parts
            .iter()
            .map(|p| p.gen_sql_segments())
            .flatten()
            .collect()
    }
}