tor-config: Example for load module

This commit is contained in:
Ian Jackson 2022-05-24 19:48:13 +01:00
parent bb8e205b0d
commit 9c88158740
3 changed files with 48 additions and 0 deletions

1
Cargo.lock generated
View File

@ -3426,6 +3426,7 @@ dependencies = [
name = "tor-config"
version = "0.3.0"
dependencies = [
"anyhow",
"config",
"derive_builder_fork_arti",
"directories",

View File

@ -36,6 +36,7 @@ tracing = "0.1.18"
directories = { version = "4", optional = true }
[dev-dependencies]
anyhow = "1.0.23"
config = { version = "0.13", default-features = false, features = ["toml"] }
dirs = "4.0.0"
rmp-serde = "1"

View File

@ -1,4 +1,50 @@
//! Processing a config::Config into a validated configuration
//!
//! # Example
//!
//! ```
//! # fn main() -> Result<(), anyhow::Error> {
//! use derive_builder::Builder;
//! use tor_config::{impl_standard_builder, resolve, ConfigBuildError, ConfigurationSources};
//! use tor_config::load::TopLevel;
//! use serde::{Deserialize, Serialize};
//!
//! #[derive(Debug, Clone, Builder, Eq, PartialEq)]
//! #[builder(build_fn(error = "ConfigBuildError"))]
//! #[builder(derive(Debug, Serialize, Deserialize))]
//! struct EmbedderConfig {
//! // ....
//! }
//! impl_standard_builder! { EmbedderConfig }
//! impl TopLevel for EmbedderConfig {
//! type Builder = EmbedderConfigBuilder;
//! }
//! #
//! # #[derive(Debug, Clone, Builder, Eq, PartialEq)]
//! # #[builder(build_fn(error = "ConfigBuildError"))]
//! # #[builder(derive(Debug, Serialize, Deserialize))]
//! # struct TorClientConfig { }
//! # impl_standard_builder! { TorClientConfig }
//! # impl TopLevel for TorClientConfig { type Builder = TorClientConfigBuilder; }
//! #
//! # #[derive(Debug, Clone, Builder, Eq, PartialEq)]
//! # #[builder(build_fn(error = "ConfigBuildError"))]
//! # #[builder(derive(Debug, Serialize, Deserialize))]
//! # struct ArtiConfig { }
//! # impl_standard_builder! { ArtiConfig }
//! # impl TopLevel for ArtiConfig { type Builder = ArtiConfigBuilder; }
//!
//! let cfg_sources = ConfigurationSources::new_empty(); // In real program, use from_cmdline
//! let cfg = cfg_sources.load()?;
//!
//! let (tcc, arti_config, embedder_config) =
//! tor_config::resolve::<(TorClientConfig, ArtiConfig, EmbedderConfig)>(cfg)?;
//!
//! let _: EmbedderConfig = embedder_config; // etc.
//!
//! # Ok(())
//! # }
//! ```
use std::collections::BTreeSet;
use std::fmt::{self, Display};