rust-eloquent 1.0.0

An Active Record ORM for Rust, inspired by Laravel's Eloquent.
Documentation
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 {
    // Mutator / Before Save Event
    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(())
    }

    // Accessor / After Fetch Event
    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?;

    // Create user
    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(())
}