use std::fmt::Arguments;
use std::fmt::Write;
use crate::value::Value;
use crate::value::write_value;
pub trait SqlWriter {
fn push_param(&mut self, value: Value);
fn push_str(&mut self, value: &str);
fn push_char(&mut self, value: char);
fn push_fmt(&mut self, args: Arguments);
}
impl SqlWriter for String {
fn push_param(&mut self, value: Value) {
write_value(self, &value);
}
fn push_str(&mut self, value: &str) {
String::push_str(self, value)
}
fn push_char(&mut self, value: char) {
String::push(self, value)
}
fn push_fmt(&mut self, args: Arguments) {
self.write_fmt(args).unwrap();
}
}
pub struct SqlWriterValues {
sql: String,
values: Vec<Value>,
counter: usize,
}
impl SqlWriterValues {
pub fn new() -> Self {
Self {
sql: String::new(),
values: Vec::new(),
counter: 0,
}
}
pub fn into_parts(self) -> (String, Vec<Value>) {
(self.sql, self.values)
}
}
impl Default for SqlWriterValues {
fn default() -> Self {
Self::new()
}
}
impl SqlWriter for SqlWriterValues {
fn push_param(&mut self, value: Value) {
self.counter += 1;
write!(self.sql, "${}", self.counter).unwrap();
self.values.push(value);
}
fn push_str(&mut self, value: &str) {
self.sql.push_str(value);
}
fn push_char(&mut self, value: char) {
self.sql.push(value);
}
fn push_fmt(&mut self, args: Arguments) {
self.sql.write_fmt(args).unwrap();
}
}