sntl 0.1.0

Compile-time guarded ORM for PostgreSQL — your data's guardian from compile to production
Documentation
use sntl::Model;
use sntl::core::Value;
use sntl::core::model::Model as ModelTrait;

#[derive(Model)]
#[sentinel(table = "users")]
pub struct User {
    #[sentinel(primary_key, default = "gen_random_uuid()")]
    pub id: uuid::Uuid,

    #[sentinel(unique)]
    pub email: String,

    pub name: Option<String>,

    #[sentinel(default = "now()")]
    pub created_at: chrono::DateTime<chrono::Utc>,
}

#[test]
fn model_trait_table_name() {
    assert_eq!(User::TABLE, "users");
}

#[test]
fn model_trait_primary_key() {
    assert_eq!(User::PRIMARY_KEY, "id");
}

#[test]
fn model_trait_columns() {
    let cols = User::columns();
    assert_eq!(cols.len(), 4);
    assert_eq!(cols[0].name, "id");
    assert_eq!(cols[0].column_type, "uuid");
    assert!(!cols[0].nullable);
    assert!(cols[0].has_default);

    assert_eq!(cols[1].name, "email");
    assert!(!cols[1].nullable);
    assert!(!cols[1].has_default);

    assert_eq!(cols[2].name, "name");
    assert!(cols[2].nullable);

    assert_eq!(cols[3].name, "created_at");
    assert!(cols[3].has_default);
}

#[test]
fn model_find() {
    let q = User::find();
    let (sql, _) = q.build();
    assert_eq!(sql, "SELECT \"users\".* FROM \"users\"");
}

#[test]
fn model_find_by_id() {
    let q = User::find_by_id(Value::from("abc-123"));
    let (sql, binds) = q.build();
    assert_eq!(sql, "SELECT \"users\".* FROM \"users\" WHERE \"id\" = $1");
    assert_eq!(binds.len(), 1);
}

#[test]
fn model_delete() {
    let q = User::delete(Value::from("abc-123"));
    let (sql, binds) = q.build();
    assert_eq!(sql, "DELETE FROM \"users\" WHERE \"id\" = $1");
    assert_eq!(binds.len(), 1);
}