1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
use crate::{
behavior::{push_unique, Concat, WithQuery},
fmt,
structure::{Values, ValuesClause},
};
impl Values {
/// Gets the current state of the Values and returns it as string
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let query = sql::Values::new()
/// .values("('foo', 'Foo')")
/// .as_string();
/// ```
///
/// Output
/// ```sql
/// VALUES ('foo', 'Foo')
/// ```
pub fn as_string(&self) -> String {
let fmts = fmt::one_line();
self.concat(&fmts)
}
/// Prints the current state of the Values into console output in a more ease to read version.
/// This method is useful to debug complex queries or just to print the generated SQL while you type
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let values = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .values("(3, 'three')")
/// .debug();
/// ```
///
/// Output
///
/// ```sql
/// VALUES (1, 'one'), (2, 'two'), (3, 'three')
/// ```
pub fn debug(self) -> Self {
let fmts = fmt::multiline();
println!("{}", fmt::format(self.concat(&fmts), &fmts));
self
}
/// Create Values's instance
pub fn new() -> Self {
Self::default()
}
/// Prints the current state of the Values into console output similar to debug method,
/// the difference is that this method prints in one line.
pub fn print(self) -> Self {
let fmts = fmt::one_line();
println!("{}", fmt::format(self.concat(&fmts), &fmts));
self
}
/// Adds at the beginning a raw SQL query.
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let raw_query = "insert into my_table(nun, txt)";
/// let values = sql::Values::new()
/// .raw(raw_query)
/// .values("(1, 'one'), (2, 'two')")
/// .debug();
/// ```
///
/// Output
///
/// ```sql
/// insert into my_table(num, txt)
/// VALUES (1, 'one'), (2, 'two')
/// ```
pub fn raw(mut self, raw_sql: &str) -> Self {
push_unique(&mut self._raw, raw_sql.trim().to_owned());
self
}
/// Adds a raw SQL query after a specified clause.
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let raw_query = ", (3, 'three')";
/// let values = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .raw_after(sql::ValuesClause::Values, raw_query)
/// .debug();
/// ```
///
/// Output
///
/// ```sql
/// VALUES (1, 'one'), (2, 'two') , (3, 'three')
/// ```
pub fn raw_after(mut self, clause: ValuesClause, raw_sql: &str) -> Self {
self._raw_after.push((clause, raw_sql.trim().to_owned()));
self
}
/// Adds a raw SQL query before a specified clause.
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let raw_query = "/* the values command */";
/// let values = sql::Values::new()
/// .raw_before(sql::ValuesClause::Values, raw_query)
/// .values("(1, 'one'), (2, 'two')")
/// .debug();
/// ```
///
/// Output
///
/// ```sql
/// /* the values command */
/// VALUES (1, 'one'), (2, 'two')
/// ```
pub fn raw_before(mut self, clause: ValuesClause, raw_sql: &str) -> Self {
self._raw_before.push((clause, raw_sql.trim().to_owned()));
self
}
/// The values clause
///
/// # Examples
/// ```
/// use sql_query_builder as sql;
///
/// let values = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .values("(3, 'three')");
/// ```
pub fn values(mut self, expression: &str) -> Self {
push_unique(&mut self._values, expression.trim().to_owned());
self
}
}
impl WithQuery for Values {}
impl std::fmt::Display for Values {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.as_string())
}
}
impl std::fmt::Debug for Values {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let fmts = fmt::multiline();
write!(f, "{}", fmt::format(self.concat(&fmts), &fmts))
}
}