sntl-schema 0.1.0

Shared schema analysis and cache library for Sentinel ORM macros and CLI
Documentation
use sntl_schema::schema::{Column, PgTypeRef, Schema, Table};

#[test]
fn parses_schema_toml() {
    let toml = r#"
version = 1
postgres_version = "16.2"
generated_at = "2026-04-20T10:30:00Z"
source = "postgres://localhost:5432/myapp_dev"

[[tables]]
name = "users"
schema = "public"

  [[tables.columns]]
  name = "id"
  pg_type = "uuid"
  oid = 2950
  nullable = false
  primary_key = true

  [[tables.columns]]
  name = "email"
  pg_type = "text"
  oid = 25
  nullable = false
  unique = true
"#;
    let schema: Schema = toml::from_str(toml).unwrap();
    assert_eq!(schema.version, 1);
    assert_eq!(schema.tables.len(), 1);
    assert_eq!(schema.tables[0].name, "users");
    assert_eq!(schema.tables[0].columns.len(), 2);
    assert!(schema.tables[0].columns[0].primary_key);
    assert!(!schema.tables[0].columns[1].nullable);
}

#[test]
fn lookup_table_and_column() {
    let t = Table {
        name: "users".into(),
        schema: "public".into(),
        columns: vec![
            Column {
                name: "id".into(),
                pg_type: PgTypeRef::simple("uuid"),
                oid: 2950,
                nullable: false,
                primary_key: true,
                unique: false,
                default: None,
            },
            Column {
                name: "email".into(),
                pg_type: PgTypeRef::simple("text"),
                oid: 25,
                nullable: false,
                primary_key: false,
                unique: true,
                default: None,
            },
        ],
        foreign_keys: vec![],
    };
    let s = Schema {
        version: 1,
        postgres_version: "16".into(),
        generated_at: None,
        source: None,
        tables: vec![t],
        enums: vec![],
        composites: vec![],
    };
    assert!(s.find_table("users").is_some());
    assert!(s.find_column("users", "email").is_some());
    assert!(s.find_column("users", "missing").is_none());
}