Schematic
Configuration and schema crate.
Install / Use
/learn @moonrepo/SchematicREADME
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, YAML, Pkl, RON, and more formats 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;
let result = ConfigLoader::<AppConfig>::new()
.code("secure: false", "config.yml")?
.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())?;
Related Skills
node-connect
349.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.0kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.0kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
