#schema #config #schematic

schematic_types

Shapes and types for defining schemas for Rust types

38 releases

Uses new Rust 2024

0.10.0 Feb 21, 2025
0.9.6 Nov 30, 2024
0.8.4 Jul 22, 2024
0.6.0 Feb 6, 2024
0.4.0 Jul 3, 2023

#1722 in Database interfaces

Download history 552/week @ 2024-12-04 551/week @ 2024-12-11 660/week @ 2024-12-18 680/week @ 2024-12-25 580/week @ 2025-01-01 941/week @ 2025-01-08 840/week @ 2025-01-15 1412/week @ 2025-01-22 848/week @ 2025-01-29 984/week @ 2025-02-05 1247/week @ 2025-02-12 1346/week @ 2025-02-19 1237/week @ 2025-02-26 1158/week @ 2025-03-05 937/week @ 2025-03-12 715/week @ 2025-03-19

4,221 downloads per month
Used in 22 crates (via schematic)

MIT license

51KB
1.5K SLoC

Schematic

Schematic is a library that provides:

  • A layered serde-driven configuration system with support for merge strategies, validation rules, environment variables, and more!
  • A schema modeling system that can be used to generate TypeScript types, JSON schemas, and more!

Both of these features can be used independently or together.

cargo add schematic

Get started: https://moonrepo.github.io/schematic

Configuration

  • Supports JSON, TOML, and YAML based configs via serde.
  • Load sources from the file system or secure URLs.
  • Source layering that merge into a final configuration.
  • Extend additional files through an annotated setting.
  • Field-level merge strategies with built-in merge functions.
  • Aggregated validation with built-in validate functions (provided by garde).
  • Environment variable parsing and overrides.
  • Beautiful parsing and validation errors (powered by miette).
  • Generates schemas that can be rendered to TypeScript types, JSON schemas, and more!

Define a struct or enum and derive the Config trait.

use schematic::Config;

#[derive(Config)]
struct AppConfig {
	#[setting(default = 3000, env = "PORT")]
	port: usize,

	#[setting(default = true)]
	secure: bool,

	#[setting(default = vec!["localhost".into()])]
	allowed_hosts: Vec<String>,
}

Then load, parse, merge, and validate the configuration from one or many sources. A source is either a file path, secure URL, or code block.

use schematic::{ConfigLoader, Format};

let result = ConfigLoader::<AppConfig>::new()
	.code("secure: false", Format::Yaml)?
	.file("path/to/config.yml")?
	.url("https://ordomain.com/to/config.yaml")?
	.load()?;

result.config;
result.layers;

Schemas

Define a struct or enum and derive or implement the Schematic trait.

use schematic::Schematic;

#[derive(Schematic)]
struct Task {
	command: String,
	args: Vec<String>,
	env: HashMap<String, String>,
}

Then generate output in multiple formats, like JSON schemas or TypeScript types, using the schema type information.

use schematic::schema::{SchemaGenerator, TypeScriptRenderer};

let mut generator = SchemaGenerator::default();
generator.add::<Task>();
generator.generate(output_dir.join("types.ts"), TypeScriptRenderer::default())?;

Dependencies

~0.7–3MB
~53K SLoC