Loading Cargo.lock +21 −26 Original line number Diff line number Diff line Loading @@ -62,12 +62,6 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arti" version = "0.0.4" Loading Loading @@ -628,12 +622,14 @@ dependencies = [ [[package]] name = "config" version = "0.11.0" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" checksum = "54ad70579325f1a38ea4c13412b82241c5900700a69785d73e2736bd65a33f86" dependencies = [ "async-trait", "lazy_static", "nom", "pathdiff", "serde", "toml", ] Loading Loading @@ -1561,19 +1557,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lexical-core" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" dependencies = [ "arrayvec", "bitflags", "cfg-if 1.0.0", "ryu", "static_assertions", ] [[package]] name = "libc" version = "0.2.115" Loading Loading @@ -1678,6 +1661,12 @@ dependencies = [ "zeroize", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.4.4" Loading Loading @@ -1797,12 +1786,12 @@ dependencies = [ [[package]] name = "nom" version = "5.1.2" version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" dependencies = [ "lexical-core", "memchr", "minimal-lexical", "version_check", ] Loading Loading @@ -2007,6 +1996,12 @@ dependencies = [ "winapi 0.3.9", ] [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pem-rfc7468" version = "0.2.4" Loading Loading @@ -2868,9 +2863,9 @@ dependencies = [ [[package]] name = "tokio-util" version = "0.6.9" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" dependencies = [ "bytes", "futures-core", Loading crates/arti-bench/src/main.rs +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ use rand::distributions::Standard; use rand::Rng; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::convert::TryInto; use std::fmt; use std::fmt::Formatter; use std::future::Future; Loading crates/arti-config/Cargo.toml +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ repository="https://gitlab.torproject.org/tpo/core/arti.git/" arti-client = { package="arti-client", path = "../arti-client", version = "0.0.4"} tor-circmgr = { package="tor-circmgr", path="../tor-circmgr", version = "0.0.4"} tor-config = { package="tor-config", path = "../tor-config", version = "0.0.4", features = ["expand-paths"]} config = { version = "0.11.0", default-features = false, features = ["toml"] } config = { version = "0.12.0", default-features = false, features = ["toml"] } once_cell = "1" serde = { version = "1.0.103", features = ["derive"] } toml = "0.5" Loading crates/arti-config/src/lib.rs +39 −25 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ pub use options::{ }; use tor_config::CfgPath; /// The synchronous configuration builder type we use. /// /// (This is a type alias that config should really provide.) type ConfigBuilder = config::builder::ConfigBuilder<config::builder::DefaultState>; use std::path::{Path, PathBuf}; /// A description of where to find our configuration options. Loading Loading @@ -116,38 +121,41 @@ impl ConfigurationSources { /// Load the configuration into a new [`config::Config`]. pub fn load(&self) -> Result<config::Config, config::ConfigError> { let mut config = config::Config::new(); config.merge(config::File::from_str( let mut builder = config::Config::builder(); builder = builder.add_source(config::File::from_str( options::ARTI_DEFAULTS, config::FileFormat::Toml, ))?; load_mut(&mut config, &self.files, &self.options)?; Ok(config) )); builder = add_sources(builder, &self.files, &self.options); builder.build() } } /// As [`ConfigurationSources::load()`], but load into a mutable `Config` /// object. fn load_mut<P: AsRef<Path>>( cfg: &mut config::Config, /// Add every file and commandline source to `builder`, returning a new /// builder. fn add_sources<P>( mut builder: ConfigBuilder, files: &[(P, MustRead)], opts: &[String], ) -> Result<(), config::ConfigError> { ) -> ConfigBuilder where P: AsRef<Path>, { for (path, must_read) in files { // Not going to use File::with_name here, since it doesn't // quite do what we want. let f: config::File<_> = path.as_ref().into(); let f: config::File<_, _> = path.as_ref().into(); let required = must_read == &MustRead::MustRead; cfg.merge(f.format(config::FileFormat::Toml).required(required))?; builder = builder.add_source(f.format(config::FileFormat::Toml).required(required)); } let mut cmdline = CmdLine::new(); for opt in opts { cmdline.push_toml_line(opt.clone()); } cfg.merge(cmdline)?; builder = builder.add_source(cmdline); Ok(()) builder } /// Return a filename for the default user configuration file. Loading @@ -167,13 +175,21 @@ world = \"stuff\" friends = 4242 "; /// Load from a set of files and option strings, without taking /// the arti defaults into account. fn load_nodefaults<P: AsRef<Path>>( files: &[(P, MustRead)], opts: &[String], ) -> Result<config::Config, config::ConfigError> { add_sources(config::Config::builder(), files, opts).build() } #[test] fn non_required_file() { let td = tempdir().unwrap(); let dflt = td.path().join("a_file"); let files = vec![(dflt, MustRead::TolerateAbsence)]; let mut c = config::Config::new(); load_mut(&mut c, &files, Default::default()).unwrap(); load_nodefaults(&files, Default::default()).unwrap(); } static EX2_TOML: &str = " Loading @@ -186,13 +202,12 @@ world = \"nonsense\" let td = tempdir().unwrap(); let dflt = td.path().join("a_file"); let cf = td.path().join("other_file"); let mut c = config::Config::new(); std::fs::write(&cf, EX2_TOML).unwrap(); let files = vec![(dflt, MustRead::TolerateAbsence), (cf, MustRead::MustRead)]; load_mut(&mut c, &files, Default::default()).unwrap(); let c = load_nodefaults(&files, Default::default()).unwrap(); assert!(c.get_str("hello.friends").is_err()); assert_eq!(c.get_str("hello.world").unwrap(), "nonsense".to_string()); assert!(c.get_string("hello.friends").is_err()); assert_eq!(c.get_string("hello.world").unwrap(), "nonsense".to_string()); } #[test] Loading @@ -200,16 +215,15 @@ world = \"nonsense\" let td = tempdir().unwrap(); let cf1 = td.path().join("a_file"); let cf2 = td.path().join("other_file"); let mut c = config::Config::new(); std::fs::write(&cf1, EX_TOML).unwrap(); std::fs::write(&cf2, EX2_TOML).unwrap(); let v = vec![(cf1, MustRead::TolerateAbsence), (cf2, MustRead::MustRead)]; let v2 = vec!["other.var=present".to_string()]; load_mut(&mut c, &v, &v2).unwrap(); let c = load_nodefaults(&v, &v2).unwrap(); assert_eq!(c.get_str("hello.friends").unwrap(), "4242".to_string()); assert_eq!(c.get_str("hello.world").unwrap(), "nonsense".to_string()); assert_eq!(c.get_str("other.var").unwrap(), "present".to_string()); assert_eq!(c.get_string("hello.friends").unwrap(), "4242".to_string()); assert_eq!(c.get_string("hello.world").unwrap(), "nonsense".to_string()); assert_eq!(c.get_string("other.var").unwrap(), "present".to_string()); } #[test] Loading crates/arti-config/src/options.rs +16 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use arti_client::config::{ use derive_builder::Builder; use serde::Deserialize; use std::collections::HashMap; use std::convert::TryFrom; use tor_config::{CfgPath, ConfigBuildError}; /// Default options to use for our configuration. Loading Loading @@ -288,6 +289,13 @@ pub struct ArtiConfig { system: SystemConfig, } impl TryFrom<config::Config> for ArtiConfig { type Error = config::ConfigError; fn try_from(cfg: config::Config) -> Result<ArtiConfig, Self::Error> { cfg.try_deserialize() } } impl From<ArtiConfig> for TorClientConfigBuilder { fn from(cfg: ArtiConfig) -> TorClientConfigBuilder { let mut builder = TorClientConfig::builder(); Loading Loading @@ -570,6 +578,7 @@ impl From<ArtiConfig> for ArtiConfigBuilder { mod test { #![allow(clippy::unwrap_used)] use std::convert::TryInto; use std::time::Duration; use super::*; Loading @@ -577,11 +586,12 @@ mod test { #[test] fn default_config() { // TODO: this is duplicate code. let mut cfg = config::Config::new(); cfg.merge(config::File::from_str( let cfg = config::Config::builder() .add_source(config::File::from_str( ARTI_DEFAULTS, config::FileFormat::Toml, )) .build() .unwrap(); let parsed: ArtiConfig = cfg.try_into().unwrap(); Loading Loading
Cargo.lock +21 −26 Original line number Diff line number Diff line Loading @@ -62,12 +62,6 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "arti" version = "0.0.4" Loading Loading @@ -628,12 +622,14 @@ dependencies = [ [[package]] name = "config" version = "0.11.0" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" checksum = "54ad70579325f1a38ea4c13412b82241c5900700a69785d73e2736bd65a33f86" dependencies = [ "async-trait", "lazy_static", "nom", "pathdiff", "serde", "toml", ] Loading Loading @@ -1561,19 +1557,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lexical-core" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" dependencies = [ "arrayvec", "bitflags", "cfg-if 1.0.0", "ryu", "static_assertions", ] [[package]] name = "libc" version = "0.2.115" Loading Loading @@ -1678,6 +1661,12 @@ dependencies = [ "zeroize", ] [[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" version = "0.4.4" Loading Loading @@ -1797,12 +1786,12 @@ dependencies = [ [[package]] name = "nom" version = "5.1.2" version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" dependencies = [ "lexical-core", "memchr", "minimal-lexical", "version_check", ] Loading Loading @@ -2007,6 +1996,12 @@ dependencies = [ "winapi 0.3.9", ] [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pem-rfc7468" version = "0.2.4" Loading Loading @@ -2868,9 +2863,9 @@ dependencies = [ [[package]] name = "tokio-util" version = "0.6.9" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" checksum = "64910e1b9c1901aaf5375561e35b9c057d95ff41a44ede043a03e09279eabaf1" dependencies = [ "bytes", "futures-core", Loading
crates/arti-bench/src/main.rs +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ use rand::distributions::Standard; use rand::Rng; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::convert::TryInto; use std::fmt; use std::fmt::Formatter; use std::future::Future; Loading
crates/arti-config/Cargo.toml +1 −1 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ repository="https://gitlab.torproject.org/tpo/core/arti.git/" arti-client = { package="arti-client", path = "../arti-client", version = "0.0.4"} tor-circmgr = { package="tor-circmgr", path="../tor-circmgr", version = "0.0.4"} tor-config = { package="tor-config", path = "../tor-config", version = "0.0.4", features = ["expand-paths"]} config = { version = "0.11.0", default-features = false, features = ["toml"] } config = { version = "0.12.0", default-features = false, features = ["toml"] } once_cell = "1" serde = { version = "1.0.103", features = ["derive"] } toml = "0.5" Loading
crates/arti-config/src/lib.rs +39 −25 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ pub use options::{ }; use tor_config::CfgPath; /// The synchronous configuration builder type we use. /// /// (This is a type alias that config should really provide.) type ConfigBuilder = config::builder::ConfigBuilder<config::builder::DefaultState>; use std::path::{Path, PathBuf}; /// A description of where to find our configuration options. Loading Loading @@ -116,38 +121,41 @@ impl ConfigurationSources { /// Load the configuration into a new [`config::Config`]. pub fn load(&self) -> Result<config::Config, config::ConfigError> { let mut config = config::Config::new(); config.merge(config::File::from_str( let mut builder = config::Config::builder(); builder = builder.add_source(config::File::from_str( options::ARTI_DEFAULTS, config::FileFormat::Toml, ))?; load_mut(&mut config, &self.files, &self.options)?; Ok(config) )); builder = add_sources(builder, &self.files, &self.options); builder.build() } } /// As [`ConfigurationSources::load()`], but load into a mutable `Config` /// object. fn load_mut<P: AsRef<Path>>( cfg: &mut config::Config, /// Add every file and commandline source to `builder`, returning a new /// builder. fn add_sources<P>( mut builder: ConfigBuilder, files: &[(P, MustRead)], opts: &[String], ) -> Result<(), config::ConfigError> { ) -> ConfigBuilder where P: AsRef<Path>, { for (path, must_read) in files { // Not going to use File::with_name here, since it doesn't // quite do what we want. let f: config::File<_> = path.as_ref().into(); let f: config::File<_, _> = path.as_ref().into(); let required = must_read == &MustRead::MustRead; cfg.merge(f.format(config::FileFormat::Toml).required(required))?; builder = builder.add_source(f.format(config::FileFormat::Toml).required(required)); } let mut cmdline = CmdLine::new(); for opt in opts { cmdline.push_toml_line(opt.clone()); } cfg.merge(cmdline)?; builder = builder.add_source(cmdline); Ok(()) builder } /// Return a filename for the default user configuration file. Loading @@ -167,13 +175,21 @@ world = \"stuff\" friends = 4242 "; /// Load from a set of files and option strings, without taking /// the arti defaults into account. fn load_nodefaults<P: AsRef<Path>>( files: &[(P, MustRead)], opts: &[String], ) -> Result<config::Config, config::ConfigError> { add_sources(config::Config::builder(), files, opts).build() } #[test] fn non_required_file() { let td = tempdir().unwrap(); let dflt = td.path().join("a_file"); let files = vec![(dflt, MustRead::TolerateAbsence)]; let mut c = config::Config::new(); load_mut(&mut c, &files, Default::default()).unwrap(); load_nodefaults(&files, Default::default()).unwrap(); } static EX2_TOML: &str = " Loading @@ -186,13 +202,12 @@ world = \"nonsense\" let td = tempdir().unwrap(); let dflt = td.path().join("a_file"); let cf = td.path().join("other_file"); let mut c = config::Config::new(); std::fs::write(&cf, EX2_TOML).unwrap(); let files = vec![(dflt, MustRead::TolerateAbsence), (cf, MustRead::MustRead)]; load_mut(&mut c, &files, Default::default()).unwrap(); let c = load_nodefaults(&files, Default::default()).unwrap(); assert!(c.get_str("hello.friends").is_err()); assert_eq!(c.get_str("hello.world").unwrap(), "nonsense".to_string()); assert!(c.get_string("hello.friends").is_err()); assert_eq!(c.get_string("hello.world").unwrap(), "nonsense".to_string()); } #[test] Loading @@ -200,16 +215,15 @@ world = \"nonsense\" let td = tempdir().unwrap(); let cf1 = td.path().join("a_file"); let cf2 = td.path().join("other_file"); let mut c = config::Config::new(); std::fs::write(&cf1, EX_TOML).unwrap(); std::fs::write(&cf2, EX2_TOML).unwrap(); let v = vec![(cf1, MustRead::TolerateAbsence), (cf2, MustRead::MustRead)]; let v2 = vec!["other.var=present".to_string()]; load_mut(&mut c, &v, &v2).unwrap(); let c = load_nodefaults(&v, &v2).unwrap(); assert_eq!(c.get_str("hello.friends").unwrap(), "4242".to_string()); assert_eq!(c.get_str("hello.world").unwrap(), "nonsense".to_string()); assert_eq!(c.get_str("other.var").unwrap(), "present".to_string()); assert_eq!(c.get_string("hello.friends").unwrap(), "4242".to_string()); assert_eq!(c.get_string("hello.world").unwrap(), "nonsense".to_string()); assert_eq!(c.get_string("other.var").unwrap(), "present".to_string()); } #[test] Loading
crates/arti-config/src/options.rs +16 −6 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ use arti_client::config::{ use derive_builder::Builder; use serde::Deserialize; use std::collections::HashMap; use std::convert::TryFrom; use tor_config::{CfgPath, ConfigBuildError}; /// Default options to use for our configuration. Loading Loading @@ -288,6 +289,13 @@ pub struct ArtiConfig { system: SystemConfig, } impl TryFrom<config::Config> for ArtiConfig { type Error = config::ConfigError; fn try_from(cfg: config::Config) -> Result<ArtiConfig, Self::Error> { cfg.try_deserialize() } } impl From<ArtiConfig> for TorClientConfigBuilder { fn from(cfg: ArtiConfig) -> TorClientConfigBuilder { let mut builder = TorClientConfig::builder(); Loading Loading @@ -570,6 +578,7 @@ impl From<ArtiConfig> for ArtiConfigBuilder { mod test { #![allow(clippy::unwrap_used)] use std::convert::TryInto; use std::time::Duration; use super::*; Loading @@ -577,11 +586,12 @@ mod test { #[test] fn default_config() { // TODO: this is duplicate code. let mut cfg = config::Config::new(); cfg.merge(config::File::from_str( let cfg = config::Config::builder() .add_source(config::File::from_str( ARTI_DEFAULTS, config::FileFormat::Toml, )) .build() .unwrap(); let parsed: ArtiConfig = cfg.try_into().unwrap(); Loading