use ankurah_core::value::Value;
#[derive(Debug, Clone)]
pub enum SqliteValue {
Text(String),
Integer(i64),
Real(f64),
Blob(Vec<u8>),
Jsonb(serde_json::Value),
Null,
}
impl SqliteValue {
pub fn sqlite_type(&self) -> &'static str {
match self {
SqliteValue::Text(_) => "TEXT",
SqliteValue::Integer(_) => "INTEGER",
SqliteValue::Real(_) => "REAL",
SqliteValue::Blob(_) => "BLOB",
SqliteValue::Jsonb(_) => "BLOB",
SqliteValue::Null => "TEXT", }
}
pub fn is_jsonb(&self) -> bool { matches!(self, SqliteValue::Jsonb(_)) }
pub fn as_json_string(&self) -> Option<String> {
match self {
SqliteValue::Jsonb(j) => Some(j.to_string()),
_ => None,
}
}
pub fn to_sql(&self) -> rusqlite::types::Value {
match self {
SqliteValue::Text(s) => rusqlite::types::Value::Text(s.clone()),
SqliteValue::Integer(i) => rusqlite::types::Value::Integer(*i),
SqliteValue::Real(f) => rusqlite::types::Value::Real(*f),
SqliteValue::Blob(b) => rusqlite::types::Value::Blob(b.clone()),
SqliteValue::Jsonb(j) => rusqlite::types::Value::Text(j.to_string()),
SqliteValue::Null => rusqlite::types::Value::Null,
}
}
}
impl From<Value> for SqliteValue {
fn from(value: Value) -> Self {
match value {
Value::String(s) => SqliteValue::Text(s),
Value::I16(i) => SqliteValue::Integer(i as i64),
Value::I32(i) => SqliteValue::Integer(i as i64),
Value::I64(i) => SqliteValue::Integer(i),
Value::F64(f) => SqliteValue::Real(f),
Value::Bool(b) => SqliteValue::Integer(if b { 1 } else { 0 }),
Value::EntityId(id) => SqliteValue::Text(id.to_base64()),
Value::Object(bytes) => SqliteValue::Blob(bytes),
Value::Binary(bytes) => SqliteValue::Blob(bytes),
Value::Json(json) => SqliteValue::Jsonb(json),
}
}
}
impl From<Option<Value>> for SqliteValue {
fn from(value: Option<Value>) -> Self {
match value {
Some(v) => v.into(),
None => SqliteValue::Null,
}
}
}
impl From<rusqlite::types::Value> for SqliteValue {
fn from(value: rusqlite::types::Value) -> Self {
match value {
rusqlite::types::Value::Null => SqliteValue::Null,
rusqlite::types::Value::Integer(i) => SqliteValue::Integer(i),
rusqlite::types::Value::Real(f) => SqliteValue::Real(f),
rusqlite::types::Value::Text(s) => SqliteValue::Text(s),
rusqlite::types::Value::Blob(b) => SqliteValue::Blob(b),
}
}
}