use drizzle_core::{Placeholder, SQL, SQLParam};
use super::SQLiteValue;
use super::insert::ValueWrapper;
#[derive(Debug, Clone, Default)]
#[allow(clippy::large_enum_variant)]
pub enum SQLiteUpdateValue<'a, V: SQLParam, T> {
#[default]
Skip,
Null,
Value(ValueWrapper<'a, V, T>),
}
impl<'a, V: SQLParam, T> SQLiteUpdateValue<'a, V, T> {
pub fn is_skip(&self) -> bool {
matches!(self, Self::Skip)
}
}
impl<'a, T, U> From<T> for SQLiteUpdateValue<'a, SQLiteValue<'a>, U>
where
T: TryInto<SQLiteValue<'a>>,
T: TryInto<U>,
U: TryInto<SQLiteValue<'a>>,
{
fn from(value: T) -> Self {
let sql = TryInto::<U>::try_into(value)
.map(|v| v.try_into().unwrap_or_default())
.map(|v: SQLiteValue<'a>| SQL::from(v))
.unwrap_or_else(|_| SQL::from(SQLiteValue::Null));
SQLiteUpdateValue::Value(ValueWrapper::<SQLiteValue<'a>, T>::new(sql))
}
}
impl<'a, T> From<Placeholder> for SQLiteUpdateValue<'a, SQLiteValue<'a>, T> {
fn from(placeholder: Placeholder) -> Self {
use drizzle_core::{Param, SQLChunk};
let chunk = SQLChunk::Param(Param {
placeholder,
value: None,
});
SQLiteUpdateValue::Value(ValueWrapper::<SQLiteValue<'a>, T>::new(
std::iter::once(chunk).collect(),
))
}
}
impl<'a, const N: usize> From<[u8; N]> for SQLiteUpdateValue<'a, SQLiteValue<'a>, Vec<u8>> {
fn from(value: [u8; N]) -> Self {
let sqlite_value = SQLiteValue::Blob(std::borrow::Cow::Owned(value.to_vec()));
let sql = SQL::param(sqlite_value);
SQLiteUpdateValue::Value(ValueWrapper::<SQLiteValue<'a>, Vec<u8>>::new(sql))
}
}