#![cfg(any(feature = "rusqlite", feature = "turso", feature = "libsql"))]
#![cfg(all(feature = "serde", feature = "uuid"))]
use drizzle::core::expr::*;
use drizzle::sqlite::prelude::*;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)]
pub struct Profile {
age: i64,
name: String,
interests: Vec<String>,
}
#[derive(SQLiteFromRow, Serialize, Deserialize, Debug, PartialEq, Clone, Default)]
pub struct UserResult {
id: Uuid,
age: Option<i64>,
}
#[SQLiteTable(NAME = "json_users", STRICT)]
struct JsonUser {
id: Uuid,
email: String,
#[column(JSON)]
profile: Profile,
}
#[derive(SQLiteSchema)]
struct Schema {
jsonuser: JsonUser,
}
#[derive(SQLiteFromRow, Debug, PartialEq, Default)]
pub struct JsonReadResult {
id: Uuid,
email: String,
#[json]
profile: Profile,
}
#[drizzle::test]
fn json_storage(db: &mut TestDb<Schema>) {
let Schema { jsonuser } = schema;
let profile = Profile {
age: 30,
name: "John".to_string(),
interests: vec!["Coding".to_string(), "Reading".to_string()],
};
let id = Uuid::new_v4();
let stmt =
db.insert(jsonuser)
.values([InsertJsonUser::new(id, "john@test.com", profile.clone())]);
stmt.execute();
let stmt = db
.select((
jsonuser.id,
cast(
drizzle::sqlite::expr::json_extract(jsonuser.profile, "age"),
drizzle::sqlite::types::Integer,
)
.alias("age"),
))
.from(jsonuser)
.r#where(eq(jsonuser.id, id));
let user: UserResult = stmt.get();
assert_eq!(user.id, id);
assert_eq!(user.age, Some(30));
let stmt = db
.select((jsonuser.id, jsonuser.email, jsonuser.profile))
.from(jsonuser)
.r#where(eq(jsonuser.id, id));
let result: JsonReadResult = stmt.get();
assert_eq!(result.id, id);
assert_eq!(result.email, "john@test.com");
assert_eq!(result.profile, profile);
}