Konfigurationsschema
English | 中文 | 日本語 | 한국어 | Français | Deutsch | Español | Português | Svenska | Suomi | Nederlands
Programscheman ar vanliga confique-konfigurationstyper. Rotschemat maste
implementera ConfigSchema sa rust-config-tree kan upptacka rekursiva
includes fran det mellanliggande confique-lagret.
#![allow(unused)]
fn main() {
use std::path::PathBuf;
use confique::Config;
use schemars::JsonSchema;
use rust_config_tree::ConfigSchema;
#[derive(Debug, Config, JsonSchema)]
struct AppConfig {
#[config(default = [])]
include: Vec<PathBuf>,
#[config(nested)]
#[schemars(extend("x-tree-split" = true))]
database: DatabaseConfig,
}
#[derive(Debug, Config, JsonSchema)]
struct DatabaseConfig {
#[config(env = "APP_DATABASE_URL")]
url: String,
#[config(default = 16)]
#[config(env = "APP_DATABASE_POOL_SIZE")]
pool_size: u32,
}
impl ConfigSchema for AppConfig {
fn include_paths(layer: &<Self as Config>::Layer) -> Vec<PathBuf> {
layer.include.clone().unwrap_or_default()
}
}
}
Include-falt
Include-faltet kan ha vilket namn som helst. rust-config-tree kanner bara till
det via ConfigSchema::include_paths.
Faltet bor normalt ha en tom standard:
#![allow(unused)]
fn main() {
#[config(default = [])]
include: Vec<PathBuf>,
}
Laddaren tar emot ett partiellt laddat lager for varje fil. Det gor att den kan upptacka barnkonfigurationsfiler innan det slutliga schemat slas samman och valideras.
Nastlade sektioner
Anvand #[config(nested)] for strukturerade sektioner. Nastlade sektioner
anvands alltid for runtime-laddning. Lagg till
#[schemars(extend("x-tree-split" = true))] nar ett nastlat falt ocksa ska
genereras som egen *.yaml-mall och <section>.schema.json-schema:
#![allow(unused)]
fn main() {
#[derive(Debug, Config, JsonSchema)]
struct AppConfig {
#[config(nested)]
#[schemars(extend("x-tree-split" = true))]
server: ServerConfig,
}
}
Den naturliga YAML-formen ar:
server:
bind: 127.0.0.1
port: 8080
Endast miljo-falt
Markera ett bladfalt med #[schemars(extend("x-env-only" = true))] nar vardet bara ska komma fran en miljovariabel och inte ska visas i genererade konfigurationsfiler. Genererade YAML-mallar och JSON Schemas utelamnar env-only-falt, och foralderobjekt som blir tomma tas bort.
#![allow(unused)]
fn main() {
#[config(env = "APP_SECRET")]
#[schemars(extend("x-env-only" = true))]
secret: String,
}
Faltvardevalidering
Genererade *.schema.json-filer ar bara for IDE-komplettering och
grundlaggande editor-kontroller. De avgor inte om ett konkret faltvarde ar
giltigt for programmet.
Faltvardevalidering ska implementeras i kod med
#[config(validate = Self::validate)]. Validatorn kors nar den slutliga
konfigurationen laddas med load_config eller kontrolleras med
config-validate.
Overstyrning av mallsektioner
Nar en mallkalla saknar includes kan craten harleda barnmallfiler fran nastlade
schemasektioner markerade med x-tree-split. Standardsokvagen pa toppniva ar <section>.yaml.
Overstyr den sokvagen med template_path_for_section:
#![allow(unused)]
fn main() {
impl ConfigSchema for AppConfig {
fn include_paths(layer: &<Self as Config>::Layer) -> Vec<PathBuf> {
layer.include.clone().unwrap_or_default()
}
fn template_path_for_section(section_path: &[&str]) -> Option<PathBuf> {
match section_path {
["database"] => Some(PathBuf::from("examples/database.yaml")),
_ => None,
}
}
}
}