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 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
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
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let values_query = sql::Values::new()
/// .values("('foo', 'Foo')")
/// .as_string();
///
/// # let expected = "VALUES ('foo', 'Foo')";
/// # assert_eq!(values_query, expected);
/// ```
///
/// 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] to the standard output in a more ease to read version.
/// This method is useful to debug complex queries or just print the generated SQL while you type
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let values = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .values("(3, 'three')")
/// .debug();
///
/// # let expected = "VALUES (1, 'one'), (2, 'two'), (3, 'three')";
/// # assert_eq!(values.as_string(), expected);
/// ```
///
/// Prints to the standard 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
}
/// Creates instance of the Values command
pub fn new() -> Self {
Self::default()
}
/// Prints the current state of the [Values] to the standard 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.
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let raw_query = "insert into my_table(num, txt)";
///
/// let values_query = sql::Values::new()
/// .raw(raw_query)
/// .values("(1, 'one'), (2, 'two')")
/// .as_string();
///
/// # let expected = "insert into my_table(num, txt) VALUES (1, 'one'), (2, 'two')";
/// # assert_eq!(values_query, expected);
/// ```
///
/// 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_string());
self
}
/// Adds a raw SQL query after a specified clause.
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let raw_query = ", (3, 'three')";
///
/// let values_query = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .raw_after(sql::ValuesClause::Values, raw_query)
/// .as_string();
///
/// # let expected = "VALUES (1, 'one'), (2, 'two') , (3, 'three')";
/// # assert_eq!(values_query, expected);
/// ```
///
/// 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_string()));
self
}
/// Adds a raw SQL query before a specified clause.
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let raw_query = "/* the values command */";
///
/// let values_query = sql::Values::new()
/// .raw_before(sql::ValuesClause::Values, raw_query)
/// .values("(1, 'one'), (2, 'two')")
/// .as_string();
///
/// # let expected = "/* the values command */ VALUES (1, 'one'), (2, 'two')";
/// # assert_eq!(values_query, expected);
/// ```
///
/// 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_string()));
self
}
/// The `values` clause
///
/// # Example
///
/// ```
/// # use sql_query_builder as sql;
/// let values_query = sql::Values::new()
/// .values("(1, 'one'), (2, 'two')")
/// .values("(3, 'three')")
/// .as_string();
///
/// # let expected = "VALUES (1, 'one'), (2, 'two'), (3, 'three')";
/// # assert_eq!(values_query, expected);
/// ```
///
/// Output
///
/// ```sql
/// VALUES (1, 'one'), (2, 'two'), (3, 'three')
/// ```
pub fn values(mut self, expression: &str) -> Self {
push_unique(&mut self._values, expression.trim().to_string());
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))
}
}