Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Esquema de configuracao

English | 中文 | 日本語 | 한국어 | Français | Deutsch | Español | Português | Svenska | Suomi | Nederlands

Esquemas de aplicacao sao tipos normais de configuracao confique. O esquema raiz deve implementar ConfigSchema para que rust-config-tree possa descobrir includes recursivos a partir da camada intermediaria do confique.

#![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()
    }
}
}

Campo de include

O campo de include pode ter qualquer nome. rust-config-tree so o conhece por meio de ConfigSchema::include_paths.

Normalmente, o campo deve ter um padrao vazio:

#![allow(unused)]
fn main() {
#[config(default = [])]
include: Vec<PathBuf>,
}

O carregador recebe uma camada parcialmente carregada para cada arquivo. Isso permite descobrir arquivos de configuracao filhos antes que o esquema final seja mesclado e validado.

Secoes aninhadas

Use #[config(nested)] para secoes estruturadas. Secoes aninhadas sempre sao usadas para carregamento em tempo de execucao. Adicione #[schemars(extend("x-tree-split" = true))] quando um campo aninhado tambem deve ser gerado como seu proprio modelo *.yaml e schema <section>.schema.json:

#![allow(unused)]
fn main() {
#[derive(Debug, Config, JsonSchema)]
struct AppConfig {
    #[config(nested)]
    #[schemars(extend("x-tree-split" = true))]
    server: ServerConfig,
}
}

O formato YAML natural e:

server:
  bind: 127.0.0.1
  port: 8080

Campos somente de ambiente

Marque um campo folha com #[schemars(extend("x-env-only" = true))] quando seu valor deve vir somente de uma variavel de ambiente e nao deve aparecer em arquivos de configuracao gerados. Modelos YAML e JSON Schemas gerados omitem campos env-only, e objetos pai que ficarem vazios tambem sao removidos.

#![allow(unused)]
fn main() {
#[config(env = "APP_SECRET")]
#[schemars(extend("x-env-only" = true))]
secret: String,
}

Validacao de valores de campo

Os arquivos *.schema.json gerados servem apenas para completamento de IDE e verificacoes basicas do editor. Eles nao decidem se um valor concreto de campo e valido para a aplicacao.

A validacao de valores deve ser implementada no codigo com #[config(validate = Self::validate)]. O validador e executado quando a configuracao final e carregada por load_config ou verificada por config-validate.

Sobrescritas de secao de modelo

Quando uma origem de modelo nao tem includes, o crate pode derivar arquivos de modelo filhos a partir de secoes de esquema aninhadas marcadas com x-tree-split. O caminho padrao de primeiro nivel e <section>.yaml.

Sobrescreva esse caminho com 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,
        }
    }
}
}