use rust_eloquent::{Eloquent, sqlx::FromRow};
#[derive(Debug, Clone, FromRow, rust_eloquent::Eloquent)]
#[eloquent(table = "users", before_save = "hash_password", after_fetch = "format_name")]
pub struct User {
pub id: i32,
pub name: String,
pub password: Option<String>,
}
impl User {
pub async fn hash_password(&mut self) -> Result<(), rust_eloquent::sqlx::Error> {
if let Some(pwd) = &self.password {
if !pwd.starts_with("hashed_") {
self.password = Some(format!("hashed_{}", pwd));
println!("[Hook: before_save] Password has been hashed!");
}
}
Ok(())
}
pub async fn format_name(&mut self) -> Result<(), rust_eloquent::sqlx::Error> {
self.name = self.name.to_uppercase();
println!("[Hook: after_fetch] Name has been formatted to uppercase!");
Ok(())
}
}
#[tokio::main]
async fn main() -> Result<(), rust_eloquent::sqlx::Error> {
let _ = std::fs::remove_file("hooks_test.db");
std::fs::File::create("hooks_test.db").unwrap();
Eloquent::init("sqlite://hooks_test.db").await?;
let pool = Eloquent::pool();
rust_eloquent::sqlx::query("
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
password TEXT
);
").execute(pool).await?;
let mut user = User {
id: 0,
name: "John Doe".to_string(),
password: Some("secret123".to_string()),
};
println!("Saving user...");
user.save().await?;
println!("Saved! ID: {}, Password: {:?}", user.id, user.password);
println!("\nFetching user...");
let fetched = User::find(user.id).await?.unwrap();
println!("Fetched User Name: {}", fetched.name);
Ok(())
}