use criterium::DirectMatch;
use criterium::rusqlite::ToRusqliteSingleField;
use criterium::sql::Field;
use rusqlite::types::Value;
use rusqlite::types::ValueRef;
use serde::{Serialize,Deserialize};
#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="snake_case")]
pub enum BlobCriterium {
Equals(Box<[u8]>),
}
impl<F: Field> ToRusqliteSingleField<F> for BlobCriterium {
fn get_sql_where(&self, field_name: &str) -> String {
match self {
Self::Equals(_) => format!("{field_name} = ?")
}
}
fn get_inverted_sql_where(&self, field_name: &str) -> Option<String> {
match self {
Self::Equals(_) => Some(format!("{field_name} != ?"))
}
}
fn get_where_values(&self, _is_inverted: bool) -> Vec<Value> {
match self {
Self::Equals(blob) => vec![ValueRef::Blob(blob).into()],
}
}
}
impl DirectMatch<[u8]> for BlobCriterium {
type Output = bool;
fn criterium_match(&self, blob: &[u8]) -> bool {
match self {
Self::Equals(u) => **u == *blob,
}
}
}