sql-orm 0.1.0

Public API crate for the sql-orm workspace.
Documentation
use sql_orm::prelude::*;

#[derive(Entity, Debug, Clone)]
#[orm(table = "users", schema = "todo")]
pub struct User {
    #[orm(primary_key)]
    #[orm(identity)]
    pub id: i64,

    #[orm(length = 180)]
    #[orm(unique)]
    pub email: String,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "todo_lists", schema = "todo")]
pub struct TodoList {
    #[orm(primary_key)]
    #[orm(identity)]
    pub id: i64,

    #[orm(foreign_key(entity = User, column = id))]
    #[orm(on_delete = "cascade")]
    pub owner_user_id: i64,

    #[orm(length = 160)]
    pub title: String,
}

#[derive(Entity, Debug, Clone)]
#[orm(table = "todo_items", schema = "todo")]
#[orm(index(name = "ix_todo_items_list_position", columns(list_id, position)))]
pub struct TodoItem {
    #[orm(primary_key)]
    #[orm(identity)]
    pub id: i64,

    #[orm(foreign_key(entity = TodoList, column = id))]
    #[orm(on_delete = "cascade")]
    pub list_id: i64,

    #[orm(foreign_key(entity = User, column = id, name = "fk_todo_items_created_by_user"))]
    pub created_by_user_id: i64,

    #[orm(nullable)]
    #[orm(foreign_key(entity = User, column = id, name = "fk_todo_items_completed_by_user"))]
    #[orm(on_delete = "set null")]
    pub completed_by_user_id: Option<i64>,

    pub position: i32,
}

fn main() {
    let list_metadata = TodoList::metadata();
    let item_metadata = TodoItem::metadata();

    assert_eq!(list_metadata.foreign_keys.len(), 1);
    assert_eq!(
        list_metadata.foreign_keys[0].name,
        "fk_todo_lists_owner_user_id_users"
    );
    assert_eq!(item_metadata.foreign_keys.len(), 3);
    assert_eq!(
        item_metadata
            .foreign_key("fk_todo_items_completed_by_user")
            .expect("completed by relationship")
            .on_delete,
        ReferentialAction::SetNull
    );
    assert_eq!(
        item_metadata.indexes[0]
            .columns
            .iter()
            .map(|column| column.column_name)
            .collect::<Vec<_>>(),
        vec!["list_id", "position"]
    );
}