sql_query_builder/concat/
mod.rs

1use crate::fmt;
2
3pub(crate) mod non_standard;
4pub(crate) mod sql_standard;
5pub(crate) mod sqlite;
6
7pub trait Concat {
8  fn concat(&self, fmts: &fmt::Formatter) -> String;
9
10  fn concat_raw(&self, query: String, fmts: &fmt::Formatter, items: &Vec<String>) -> String {
11    if items.is_empty() {
12      return query;
13    }
14    let fmt::Formatter { lb, space, .. } = fmts;
15    let raw_sql = items.join(space).trim().to_string();
16
17    format!("{query}{raw_sql}{space}{lb}")
18  }
19}
20
21pub(crate) fn concat_raw_before_after<Clause: PartialEq>(
22  items_before: &Vec<(Clause, String)>,
23  items_after: &Vec<(Clause, String)>,
24  query: String,
25  fmts: &fmt::Formatter,
26  clause: Clause,
27  sql: String,
28) -> String {
29  let fmt::Formatter { space, .. } = fmts;
30  let raw_before = raw_queries(items_before, &clause).join(space).trim().to_string();
31  let raw_after = raw_queries(items_after, &clause).join(space).trim().to_string();
32  let space_after = if raw_after.is_empty() == false { space } else { "" };
33  let space_before = if raw_before.is_empty() == false { space } else { "" };
34
35  format!("{query}{raw_before}{space_before}{sql}{raw_after}{space_after}")
36}
37
38pub(crate) fn raw_queries<Clause: PartialEq>(raw_list: &Vec<(Clause, String)>, clause: &Clause) -> Vec<String> {
39  raw_list
40    .iter()
41    .filter(|item| item.0 == *clause)
42    .map(|item| item.1.clone())
43    .collect::<Vec<_>>()
44}