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")]
struct User {
    #[orm(primary_key)]
    #[orm(identity)]
    id: i64,

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

    #[orm(nullable)]
    display_name: Option<String>,

    #[orm(rowversion)]
    version: Vec<u8>,
}

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

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

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

#[derive(Insertable, Debug, Clone)]
#[orm(entity = User)]
struct NewUser {
    email: String,
    display_name: Option<String>,
}

#[derive(Changeset, Debug, Clone)]
#[orm(entity = User)]
struct UpdateUser {
    email: Option<String>,
    display_name: Option<Option<String>>,
}

#[derive(DbContext, Debug, Clone)]
struct TodoDb {
    pub users: DbSet<User>,
    pub todo_lists: DbSet<TodoList>,
}

async fn code_first_flow(db: &TodoDb) -> Result<(), OrmError> {
    let inserted = db
        .users
        .insert(NewUser {
            email: "ana@example.com".to_string(),
            display_name: Some("Ana".to_string()),
        })
        .await?;

    let _found = db.users.find(inserted.id).await?;

    let _users = db
        .users
        .query()
        .filter(User::email.contains("@example.com"))
        .order_by(User::email.asc())
        .take(20)
        .all()
        .await?;

    let _updated = db
        .users
        .update(
            inserted.id,
            UpdateUser {
                email: None,
                display_name: Some(Some("Ana Maria".to_string())),
            },
        )
        .await?;

    let _deleted = db.users.delete(inserted.id).await?;

    Ok(())
}

fn main() {
    let user_metadata = User::metadata();
    let list_metadata = TodoList::metadata();

    assert_eq!(user_metadata.schema, "todo");
    assert_eq!(user_metadata.table, "users");
    assert_eq!(user_metadata.primary_key.columns, &["id"]);
    assert_eq!(list_metadata.foreign_keys.len(), 1);

    let _connect = TodoDb::connect;
    let _connect_with_options = TodoDb::connect_with_options;
    let _connect_with_config = TodoDb::connect_with_config;
    let _from_connection = TodoDb::from_connection;
    let _from_shared = TodoDb::from_shared_connection;
    let _transaction = TodoDb::transaction::<
        fn(TodoDb) -> std::future::Ready<Result<(), OrmError>>,
        std::future::Ready<Result<(), OrmError>>,
        (),
    >;
    let _code_first_flow = code_first_flow;
}