#schema

schematic

A layered serde configuration and schema library

103 releases

Uses new Rust 2024

new 0.18.2 Mar 31, 2025
0.18.0 Feb 21, 2025
0.17.7 Nov 30, 2024
0.16.6 Jul 22, 2024
0.11.0 Jul 3, 2023

#40 in Configuration

Download history 677/week @ 2024-12-09 725/week @ 2024-12-16 798/week @ 2024-12-23 315/week @ 2024-12-30 1355/week @ 2025-01-06 827/week @ 2025-01-13 1418/week @ 2025-01-20 1090/week @ 2025-01-27 1096/week @ 2025-02-03 2242/week @ 2025-02-10 2028/week @ 2025-02-17 2505/week @ 2025-02-24 2077/week @ 2025-03-03 2063/week @ 2025-03-10 2184/week @ 2025-03-17 1599/week @ 2025-03-24

8,009 downloads per month
Used in 21 crates (13 directly)

MIT license

220KB
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

~4–17MB
~219K SLoC