87 releases

Uses new Rust 2024

0.18.7 Jun 6, 2025
0.18.4 May 14, 2025
0.18.2 Mar 31, 2025
0.17.5 Nov 30, 2024
0.11.0 Jul 3, 2023

#2424 in Procedural macros

Download history 1890/week @ 2025-02-28 1996/week @ 2025-03-07 2322/week @ 2025-03-14 1893/week @ 2025-03-21 2526/week @ 2025-03-28 3066/week @ 2025-04-04 3259/week @ 2025-04-11 3215/week @ 2025-04-18 3656/week @ 2025-04-25 2450/week @ 2025-05-02 2943/week @ 2025-05-09 3828/week @ 2025-05-16 2483/week @ 2025-05-23 2636/week @ 2025-05-30 4320/week @ 2025-06-06 2254/week @ 2025-06-13

12,284 downloads per month
Used in 22 crates (via schematic)

MIT license

110KB
3K 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

~1–1.4MB
~27K SLoC