Skip to main content

Crate neutrino_schema

Crate neutrino_schema 

Source
Expand description

Multi-database schema-to-Rust compiler pipeline.

Introspects a live PostgreSQL, MySQL/MariaDB, or SQLite database, normalises column types into a database-agnostic Intermediate Representation (SchemaIR), and generates strongly typed Rust model structs.

§Pipeline

  1. Introspect — reads schema metadata via DatabaseIntrospector
  2. Normalise — raw column types map to DbType; fields, tables, constraints, enums, and indexes collect into SchemaIR
  3. GenerateSchemaIR is consumed by generate() which returns a GeneratedOutput containing file contents; the CLI writes them via OutputWriter

§Quick start (programmatic)

use neutrino_schema::*;

let tables = vec![
    TableIR {
        name: "users".into(),
        fields: vec![FieldIR {
            name: "email".into(),
            ty: DbType::String,
            nullable: false,
            raw_type: "Varchar".into(),
            default_value: None,
            generated: false,
            comment: None,
        }],
        constraints: vec![],
        comment: None,
        indexes: vec![],
    },
];

let schema = SchemaIR::from_tables(tables, RelationStrategy::NamingHeuristic);

let output = generate(&schema, &GenerateOptions::default());
let generated = output.file("users.rs").map(|f| &f.content[..]).unwrap_or("");
assert!(generated.contains("pub struct Users"));

§Quick start (CLI)

# First run — creates neutrino-schema.toml
neutrino-schema generate
# → prompts for database URL, saves it, generates types

# Subsequent runs — just works from config
neutrino-schema generate

# Explicit setup (CI / scripting)
neutrino-schema init --database-url "postgres://localhost/mydb"
neutrino-schema generate

# All flags still work
neutrino-schema generate --database-url "mysql://user:pass@localhost/mydb" --output src/entities

Re-exports§

pub use codegen::generate;
pub use codegen::generate_enum_defs;
pub use codegen::generate_files;
pub use codegen::generate_files_with_registry;
pub use codegen::generate_imports;
pub use codegen::generate_struct;
pub use codegen::GenerateOptions;
pub use codegen::GeneratedFile;
pub use codegen::GeneratedOutput;
pub use codegen::OutputWriter;
pub use codegen::RenderMode;
pub use codegen::RustGeneratorConfig;
pub use ir::ConstraintIR;
pub use ir::ConstraintKind;
pub use ir::EnumIR;
pub use ir::EnumVariantIR;
pub use ir::FieldIR;
pub use ir::IndexEntryIR;
pub use ir::IndexIR;
pub use ir::IndexKind;
pub use ir::MatchType;
pub use ir::ReferentialAction;
pub use ir::RelationCardinality;
pub use ir::RelationIR;
pub use ir::RelationInferenceStrategy;
pub use ir::RelationOrigin;
pub use ir::RelationStrategy;
pub use ir::SchemaIR;
pub use ir::SemanticRelationIR;
pub use ir::TableIR;
pub use validation::validate;
pub use validation::ValidationEntry;
pub use validation::ValidationLevel;
pub use validation::ValidationReport;
pub use types::dbtype_to_rust;
pub use types::mysql_to_db_type;
pub use types::sqlite_declared_to_db_type;
pub use types::sqlite_to_db_type;
pub use types::to_db_type;
pub use types::DbType;
pub use types::EnumRef;
pub use types::MysqlType;
pub use types::PgType;
pub use types::RustType;
pub use types::SqliteType;
pub use types::TypeRegistry;
pub use util::naming::deduplicate_identifier;
pub use util::naming::enum_variant_name;
pub use util::naming::sanitize_identifier;
pub use util::naming::to_struct_name;
pub use introspect::Column;
pub use introspect::DatabaseIntrospector;
pub use introspect::PostgresIntrospector;
pub use introspect::SqliteIntrospector;
pub use introspect::MysqlIntrospector;

Modules§

cli
CLI entry points for the neutrino-schema binary.
codegen
Rust source code generation from SchemaIR.
config
Configuration for the code generation pipeline.
inference
Relation inference engine.
introspect
Database introspection — reads live schema metadata.
ir
Intermediate Representation (IR) — schema-agnostic model for code generation.
types
Database type representation and normalisation.
util
validation
Semantic validation for SchemaIR documents.