use std::str::FromStr;
use std::sync::Arc;
use crate::QueryError;
use crate::commons::{Arguments, Database};
#[derive(Clone, Debug)]
pub struct Statement {
pub(crate) sql: String,
pub(crate) args: Arguments<'static>,
pub(crate) error: Option<Arc<sqlx::error::BoxDynError>>,
}
impl Statement {
pub fn new(sql: &str, args: Arguments<'static>) -> Self {
Self {
sql: sql.to_string(),
args,
error: None,
}
}
pub fn bind<T>(mut self, val: T) -> Self
where
T: for<'q> sqlx::Encode<'q, Database> + sqlx::Type<Database> + Send + 'static,
{
use sqlx::Arguments as _;
match self.args.add(val) {
Ok(()) => self,
Err(e) => {
self.error = Some(Arc::new(e));
self
}
}
}
pub fn from_str(sql: &str) -> Self {
Self {
sql: sql.to_string(),
args: Arguments::default(),
error: None,
}
}
pub fn sql(&self) -> &str {
&self.sql
}
pub fn arguments(&self) -> &Arguments<'static> {
&self.args
}
pub fn into_parts(self) -> Result<(String, Arguments<'static>), QueryError> {
if let Some(err) = self.error {
return Err(QueryError::BindError(err.to_string()));
}
Ok((self.sql, self.args))
}
}
impl FromStr for Statement {
type Err = std::convert::Infallible;
fn from_str(sql: &str) -> Result<Self, Self::Err> {
Ok(Self {
sql: sql.to_string(),
args: Arguments::default(),
error: None,
})
}
}