use anyhow::Result;
use chrono::FixedOffset;
use lorm::ToLOrm;
use lorm::predicates::Where;
use sqlx::{FromRow, SqlitePool};
use uuid::Uuid;
#[derive(Debug, Default, Clone, FromRow, ToLOrm)]
struct User {
#[lorm(pk)]
#[lorm(new = "Uuid::new_v4()")]
pub id: Uuid,
#[lorm(by)]
pub email: String,
pub name: String,
#[lorm(created_at)]
#[lorm(new = "chrono::Utc::now().fixed_offset()")]
pub created_at: chrono::DateTime<FixedOffset>,
#[lorm(updated_at)]
#[lorm(new = "chrono::Utc::now().fixed_offset()")]
pub updated_at: chrono::DateTime<FixedOffset>,
}
#[tokio::main]
async fn main() -> Result<()> {
let pool = SqlitePool::connect("sqlite::memory:").await?;
sqlx::query(
r#"
CREATE TABLE users (
id TEXT PRIMARY KEY NOT NULL,
email TEXT NOT NULL,
name TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
)
"#,
)
.execute(&pool)
.await?;
println!("=== Basic CRUD Example ===\n");
println!("1. Creating a new user...");
let mut user = User::default();
user.email = "alice@example.com".to_string();
user.name = "Alice".to_string();
user = user.save(&pool).await?;
println!(" Created user: {} ({})\n", user.name, user.email);
println!("2. Reading user by ID...");
let found_user = User::by_id(&pool, user.id).await?;
println!(
" Found user: {} ({})\n",
found_user.name, found_user.email
);
println!("2bis. Reading user by ID and email...");
let id = found_user.id;
let search = User::select()
.where_id(Where::Eq, id)
.where_email(Where::Eq, "alice@example.com")
.build(&pool)
.await?;
let found_user = search.first().unwrap();
println!(
" Found user: {} ({})\n",
found_user.name, found_user.email
);
println!("3. Updating user...");
user.name = "Alice Smith".to_string();
user = user.save(&pool).await?;
println!(" Updated name to: {}\n", user.name);
println!("4. Deleting user...");
let user_id = user.id;
user.delete(&pool).await?;
println!(" User deleted\n");
println!("5. Verifying deletion...");
match User::by_id(&pool, user_id).await {
Ok(_) => println!(" ERROR: User still exists!"),
Err(_) => println!(" Confirmed: User no longer exists"),
}
Ok(())
}