From fc8cf0ed674cbb495df1baff34d4b832ca5fad3c Mon Sep 17 00:00:00 2001 From: David Orchard Date: Wed, 28 Jul 2021 22:52:15 -0700 Subject: Use LinkedHashMap in place of HashMap --- Cargo.toml | 1 + examples/async_source/main.rs | 5 +++-- examples/glob/src/main.rs | 14 +++++++------- examples/simple/src/main.rs | 6 +++--- examples/watch/src/main.rs | 4 ++-- src/builder.rs | 23 ++++++++++++----------- src/config.rs | 12 ++++++------ src/de.rs | 5 +++-- src/env.rs | 6 +++--- src/file/format/hjson.rs | 8 ++++---- src/file/format/ini.rs | 8 ++++---- src/file/format/json.rs | 8 ++++---- src/file/format/json5.rs | 8 ++++---- src/file/format/mod.rs | 8 ++++---- src/file/format/ron.rs | 8 ++++---- src/file/format/toml.rs | 8 ++++---- src/file/format/yaml.rs | 8 ++++---- src/file/mod.rs | 6 +++--- src/path/mod.rs | 10 +++++----- src/source.rs | 22 +++++++++++----------- src/value.rs | 10 +++++----- tests/async_builder.rs | 3 ++- tests/errors.rs | 3 ++- tests/file_hjson.rs | 4 ++-- tests/file_json.rs | 4 ++-- tests/file_json5.rs | 4 ++-- tests/file_ron.rs | 4 ++-- tests/file_toml.rs | 4 ++-- tests/file_yaml.rs | 4 ++-- tests/get.rs | 15 ++++++++------- tests/legacy/errors.rs | 3 ++- tests/legacy/file_hjson.rs | 4 ++-- tests/legacy/file_json.rs | 4 ++-- tests/legacy/file_ron.rs | 4 ++-- tests/legacy/file_toml.rs | 4 ++-- tests/legacy/file_yaml.rs | 4 ++-- tests/legacy/get.rs | 15 ++++++++------- tests/legacy/merge.rs | 5 ++--- tests/merge.rs | 5 ++--- 39 files changed, 144 insertions(+), 137 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f72389f..68e6617 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ serde-hjson = { version = "0.9", default-features = false, optional = true } rust-ini = { version = "0.17", optional = true } ron = { version = "0.6", optional = true } json5_rs = { version = "0.3", optional = true, package = "json5" } +linked-hash-map = { version = "0.5.4", features = ["serde_impl"] } [dev-dependencies] serde_derive = "1.0.8" diff --git a/examples/async_source/main.rs b/examples/async_source/main.rs index 10befe0..6c836a3 100644 --- a/examples/async_source/main.rs +++ b/examples/async_source/main.rs @@ -1,4 +1,5 @@ -use std::{collections::HashMap, error::Error}; +use linked_hash_map::LinkedHashMap; +use std::error::Error; use config::{builder::AsyncState, AsyncSource, ConfigBuilder, ConfigError, FileFormat}; @@ -56,7 +57,7 @@ struct HttpSource { #[async_trait] impl AsyncSource for HttpSource { - async fn collect(&self) -> Result, ConfigError> { + async fn collect(&self) -> Result, ConfigError> { reqwest::get(&self.uri) .await .map_err(|e| ConfigError::Foreign(Box::new(e)))? // error conversion is possible from custom AsyncSource impls diff --git a/examples/glob/src/main.rs b/examples/glob/src/main.rs index b3183ef..c85f86e 100644 --- a/examples/glob/src/main.rs +++ b/examples/glob/src/main.rs @@ -1,5 +1,5 @@ use std::path::Path; -use std::collections::HashMap; +use std::collections::LinkedHashMap; use config::*; use glob::glob; @@ -14,9 +14,9 @@ fn main() { .merge(File::from(Path::new("conf/05-some.yml"))).unwrap() .merge(File::from(Path::new("conf/99-extra.json"))).unwrap(); - // Print out our settings (as a HashMap) + // Print out our settings (as a LinkedHashMap) println!("\n{:?} \n\n-----------", - settings.try_into::>().unwrap()); + settings.try_into::>().unwrap()); // Option 2 // -------- @@ -28,9 +28,9 @@ fn main() { File::from(Path::new("conf/99-extra.json"))]) .unwrap(); - // Print out our settings (as a HashMap) + // Print out our settings (as a LinkedHashMap) println!("\n{:?} \n\n-----------", - settings.try_into::>().unwrap()); + settings.try_into::>().unwrap()); // Option 3 // -------- @@ -43,7 +43,7 @@ fn main() { .collect::>()) .unwrap(); - // Print out our settings (as a HashMap) + // Print out our settings (as a LinkedHashMap) println!("\n{:?} \n\n-----------", - settings.try_into::>().unwrap()); + settings.try_into::>().unwrap()); } diff --git a/examples/simple/src/main.rs b/examples/simple/src/main.rs index 1c7ddb7..698401a 100644 --- a/examples/simple/src/main.rs +++ b/examples/simple/src/main.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::LinkedHashMap; fn main() { let mut settings = config::Config::default(); @@ -9,7 +9,7 @@ fn main() { // Eg.. `APP_DEBUG=1 ./target/app` would set the `debug` key .merge(config::Environment::with_prefix("APP")).unwrap(); - // Print out our settings (as a HashMap) + // Print out our settings (as a LinkedHashMap) println!("{:?}", - settings.try_into::>().unwrap()); + settings.try_into::>().unwrap()); } diff --git a/examples/watch/src/main.rs b/examples/watch/src/main.rs index a197390..9e676ad 100644 --- a/examples/watch/src/main.rs +++ b/examples/watch/src/main.rs @@ -1,5 +1,5 @@ use config::*; -use std::collections::HashMap; +use std::collections::LinkedHashMap; use std::sync::RwLock; use notify::{RecommendedWatcher, DebouncedEvent, Watcher, RecursiveMode}; use std::sync::mpsc::channel; @@ -20,7 +20,7 @@ fn show() { .read() .unwrap() .clone() - .try_into::>() + .try_into::>() .unwrap()); } diff --git a/src/builder.rs b/src/builder.rs index bb88f44..65f49ae 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,5 +1,6 @@ +use linked_hash_map::LinkedHashMap; +use std::iter::IntoIterator; use std::str::FromStr; -use std::{collections::HashMap, iter::IntoIterator}; use crate::error::Result; use crate::source::AsyncSource; @@ -87,8 +88,8 @@ use crate::{config::Config, path::Expression, source::Source, value::Value}; /// ``` #[derive(Debug, Clone, Default)] pub struct ConfigBuilder { - defaults: HashMap, - overrides: HashMap, + defaults: LinkedHashMap, + overrides: LinkedHashMap, state: St, } @@ -120,8 +121,8 @@ pub struct DefaultState { /// Refer to [`ConfigBuilder`] for similar API sample usage or to the examples folder of the crate, where such a source is implemented. #[derive(Debug, Clone, Default)] pub struct AsyncConfigBuilder { - defaults: HashMap, - overrides: HashMap, + defaults: LinkedHashMap, + overrides: LinkedHashMap, sources: Vec, } @@ -244,11 +245,11 @@ impl ConfigBuilder { } fn build_internal( - defaults: HashMap, - overrides: HashMap, + defaults: LinkedHashMap, + overrides: LinkedHashMap, sources: &[Box], ) -> Result { - let mut cache: Value = HashMap::::new().into(); + let mut cache: Value = LinkedHashMap::::new().into(); // Add defaults for (key, val) in defaults.into_iter() { @@ -322,11 +323,11 @@ impl ConfigBuilder { } async fn build_internal( - defaults: HashMap, - overrides: HashMap, + defaults: LinkedHashMap, + overrides: LinkedHashMap, sources: &[SourceType], ) -> Result { - let mut cache: Value = HashMap::::new().into(); + let mut cache: Value = LinkedHashMap::::new().into(); // Add defaults for (key, val) in defaults.into_iter() { diff --git a/src/config.rs b/src/config.rs index b9c64b4..6302c45 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::fmt::Debug; use crate::builder::{ConfigBuilder, DefaultState}; @@ -16,8 +16,8 @@ use crate::value::{Table, Value}; /// them according to the source's priority. #[derive(Clone, Debug)] pub struct Config { - defaults: HashMap, - overrides: HashMap, + defaults: LinkedHashMap, + overrides: LinkedHashMap, sources: Vec>, /// Root of the cached configuration. @@ -83,7 +83,7 @@ impl Config { #[deprecated(since = "0.12.0", note = "please use 'ConfigBuilder' instead")] pub fn refresh(&mut self) -> Result<&mut Config> { self.cache = { - let mut cache: Value = HashMap::::new().into(); + let mut cache: Value = LinkedHashMap::::new().into(); // Add defaults for (key, val) in self.defaults.iter() { @@ -181,7 +181,7 @@ impl Config { self.get(key).and_then(Value::into_bool) } - pub fn get_table(&self, key: &str) -> Result> { + pub fn get_table(&self, key: &str) -> Result> { self.get(key).and_then(Value::into_table) } @@ -212,7 +212,7 @@ impl Source for Config { Box::new((*self).clone()) } - fn collect(&self) -> Result> { + fn collect(&self) -> Result> { self.cache.clone().into_table() } } diff --git a/src/de.rs b/src/de.rs index a7a6fb4..7d66896 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1,4 +1,5 @@ -use std::collections::{HashMap, VecDeque}; +use linked_hash_map::LinkedHashMap; +use std::collections::VecDeque; use std::iter::Enumerate; use serde::de; @@ -199,7 +200,7 @@ struct MapAccess { } impl MapAccess { - fn new(table: HashMap) -> Self { + fn new(table: LinkedHashMap) -> Self { MapAccess { elements: table.into_iter().collect(), } diff --git a/src/env.rs b/src/env.rs index 3d95e17..2e48701 100644 --- a/src/env.rs +++ b/src/env.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::env; use crate::error::*; @@ -79,8 +79,8 @@ impl Source for Environment { Box::new((*self).clone()) } - fn collect(&self) -> Result> { - let mut m = HashMap::new(); + fn collect(&self) -> Result> { + let mut m = LinkedHashMap::new(); let uri: String = "the environment".into(); let separator = self.separator.as_deref().unwrap_or(""); diff --git a/src/file/format/hjson.rs b/src/file/format/hjson.rs index f94b1d3..a61afef 100644 --- a/src/file/format/hjson.rs +++ b/src/file/format/hjson.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::value::{Value, ValueKind}; @@ -6,14 +6,14 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { // Parse a JSON object value from the text // TODO: Have a proper error fire if the root of a file is ever not a Table let value = from_hjson_value(uri, &serde_hjson::from_str(text)?); match value.kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), } } @@ -30,7 +30,7 @@ fn from_hjson_value(uri: Option<&String>, value: &serde_hjson::Value) -> Value { serde_hjson::Value::Bool(value) => Value::new(uri, ValueKind::Boolean(value)), serde_hjson::Value::Object(ref table) => { - let mut m = HashMap::new(); + let mut m = LinkedHashMap::new(); for (key, value) in table { m.insert(key.clone(), from_hjson_value(uri, value)); diff --git a/src/file/format/ini.rs b/src/file/format/ini.rs index b45695a..47f3499 100644 --- a/src/file/format/ini.rs +++ b/src/file/format/ini.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use ini::Ini; @@ -8,13 +8,13 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { - let mut map: HashMap = HashMap::new(); +) -> Result, Box> { + let mut map: LinkedHashMap = LinkedHashMap::new(); let i = Ini::load_from_str(text)?; for (sec, prop) in i.iter() { match sec { Some(sec) => { - let mut sec_map: HashMap = HashMap::new(); + let mut sec_map: LinkedHashMap = LinkedHashMap::new(); for (k, v) in prop.iter() { sec_map.insert( k.to_owned(), diff --git a/src/file/format/json.rs b/src/file/format/json.rs index 87a6e61..a6a9443 100644 --- a/src/file/format/json.rs +++ b/src/file/format/json.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::value::{Value, ValueKind}; @@ -6,14 +6,14 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { // Parse a JSON object value from the text // TODO: Have a proper error fire if the root of a file is ever not a Table let value = from_json_value(uri, &serde_json::from_str(text)?); match value.kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), } } @@ -34,7 +34,7 @@ fn from_json_value(uri: Option<&String>, value: &serde_json::Value) -> Value { serde_json::Value::Bool(value) => Value::new(uri, ValueKind::Boolean(value)), serde_json::Value::Object(ref table) => { - let mut m = HashMap::new(); + let mut m = LinkedHashMap::new(); for (key, value) in table { m.insert(key.clone(), from_json_value(uri, value)); diff --git a/src/file/format/json5.rs b/src/file/format/json5.rs index ea3390f..952b265 100644 --- a/src/file/format/json5.rs +++ b/src/file/format/json5.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::error::{ConfigError, Unexpected}; @@ -13,13 +13,13 @@ pub enum Val { Float(f64), String(String), Array(Vec), - Object(HashMap), + Object(LinkedHashMap), } pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { match json5_rs::from_str::(text)? { Val::String(ref value) => Err(Unexpected::Str(value.clone())), Val::Integer(value) => Err(Unexpected::Integer(value)), @@ -29,7 +29,7 @@ pub fn parse( Val::Null => Err(Unexpected::Unit), Val::Object(o) => match from_json5_value(uri, Val::Object(o)).kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), }, } .map_err(|err| ConfigError::invalid_root(uri, err)) diff --git a/src/file/format/mod.rs b/src/file/format/mod.rs index 53bacf6..55d1c7a 100644 --- a/src/file/format/mod.rs +++ b/src/file/format/mod.rs @@ -2,7 +2,7 @@ // BUG: ? For some reason this doesn't do anything if I try and function scope this #![allow(unused_mut)] -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::value::Value; @@ -62,8 +62,8 @@ pub enum FileFormat { lazy_static! { #[doc(hidden)] // #[allow(unused_mut)] ? - pub static ref ALL_EXTENSIONS: HashMap> = { - let mut formats: HashMap> = HashMap::new(); + pub static ref ALL_EXTENSIONS: LinkedHashMap> = { + let mut formats: LinkedHashMap> = LinkedHashMap::new(); #[cfg(feature = "toml")] formats.insert(FileFormat::Toml, vec!["toml"]); @@ -107,7 +107,7 @@ impl FileFormat { self, uri: Option<&String>, text: &str, - ) -> Result, Box> { + ) -> Result, Box> { match self { #[cfg(feature = "toml")] FileFormat::Toml => toml::parse(uri, text), diff --git a/src/file/format/ron.rs b/src/file/format/ron.rs index f7dbce3..a527d6f 100644 --- a/src/file/format/ron.rs +++ b/src/file/format/ron.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::value::{Value, ValueKind}; @@ -6,12 +6,12 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { let value = from_ron_value(uri, ron::from_str(text)?)?; match value.kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), } } @@ -56,7 +56,7 @@ fn from_ron_value( Ok((key, value)) }) - .collect::, _>>()?; + .collect::, _>>()?; ValueKind::Table(map) } diff --git a/src/file/format/toml.rs b/src/file/format/toml.rs index c7c5972..5468d97 100644 --- a/src/file/format/toml.rs +++ b/src/file/format/toml.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use crate::value::{Value, ValueKind}; @@ -6,14 +6,14 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { // Parse a TOML value from the provided text // TODO: Have a proper error fire if the root of a file is ever not a Table let value = from_toml_value(uri, &toml::from_str(text)?); match value.kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), } } @@ -25,7 +25,7 @@ fn from_toml_value(uri: Option<&String>, value: &toml::Value) -> Value { toml::Value::Boolean(value) => Value::new(uri, value), toml::Value::Table(ref table) => { - let mut m = HashMap::new(); + let mut m = LinkedHashMap::new(); for (key, value) in table { m.insert(key.clone(), from_toml_value(uri, value)); diff --git a/src/file/format/yaml.rs b/src/file/format/yaml.rs index 2526395..246758a 100644 --- a/src/file/format/yaml.rs +++ b/src/file/format/yaml.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::error::Error; use std::fmt; use std::mem; @@ -10,7 +10,7 @@ use crate::value::{Value, ValueKind}; pub fn parse( uri: Option<&String>, text: &str, -) -> Result, Box> { +) -> Result, Box> { // Parse a YAML object from file let mut docs = yaml::YamlLoader::load_from_str(text)?; let root = match docs.len() { @@ -26,7 +26,7 @@ pub fn parse( match value.kind { ValueKind::Table(map) => Ok(map), - _ => Ok(HashMap::new()), + _ => Ok(LinkedHashMap::new()), } } @@ -40,7 +40,7 @@ fn from_yaml_value(uri: Option<&String>, value: &yaml::Yaml) -> Value { yaml::Yaml::Integer(value) => Value::new(uri, ValueKind::Integer(value)), yaml::Yaml::Boolean(value) => Value::new(uri, ValueKind::Boolean(value)), yaml::Yaml::Hash(ref table) => { - let mut m = HashMap::new(); + let mut m = LinkedHashMap::new(); for (key, value) in table { if let Some(k) = key.as_str() { m.insert(k.to_owned(), from_yaml_value(uri, value)); diff --git a/src/file/mod.rs b/src/file/mod.rs index b00a271..02fd51f 100644 --- a/src/file/mod.rs +++ b/src/file/mod.rs @@ -1,7 +1,7 @@ mod format; pub mod source; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::{Path, PathBuf}; use crate::error::*; @@ -99,7 +99,7 @@ where Box::new((*self).clone()) } - fn collect(&self) -> Result> { + fn collect(&self) -> Result> { // Coerce the file contents to a string let (uri, contents, format) = match self .source @@ -110,7 +110,7 @@ where Err(error) => { if !self.required { - return Ok(HashMap::new()); + return Ok(LinkedHashMap::new()); } return Err(error); diff --git a/src/path/mod.rs b/src/path/mod.rs index d58a6f2..04c424c 100644 --- a/src/path/mod.rs +++ b/src/path/mod.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::str::FromStr; use crate::error::*; @@ -135,7 +135,7 @@ impl Expression { ), _ => { - *value = HashMap::::new().into(); + *value = LinkedHashMap::::new().into(); if let ValueKind::Table(ref mut map) = value.kind { Some( @@ -186,7 +186,7 @@ impl Expression { ValueKind::Table(_) => {} _ => { - *root = HashMap::::new().into(); + *root = LinkedHashMap::::new().into(); } } @@ -195,7 +195,7 @@ impl Expression { // Pull out another table let mut target = if let ValueKind::Table(ref mut map) = root.kind { map.entry(id.clone()) - .or_insert_with(|| HashMap::::new().into()) + .or_insert_with(|| LinkedHashMap::::new().into()) } else { unreachable!(); }; @@ -224,7 +224,7 @@ impl Expression { _ => { // Didn't find a table. Oh well. Make a table and do this anyway - *parent = HashMap::::new().into(); + *parent = LinkedHashMap::::new().into(); Expression::Identifier(key.clone()).set(parent, value); } diff --git a/src/source.rs b/src/source.rs index 831e4c4..7d257d0 100644 --- a/src/source.rs +++ b/src/source.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::fmt::Debug; use std::str::FromStr; @@ -13,8 +13,8 @@ pub trait Source: Debug { fn clone_into_box(&self) -> Box; /// Collect all configuration properties available from this source and return - /// a HashMap. - fn collect(&self) -> Result>; + /// a LinkedHashMap. + fn collect(&self) -> Result>; /// Collects all configuration properties to a provided cache. fn collect_to(&self, cache: &mut Value) -> Result<()> { @@ -55,8 +55,8 @@ pub trait AsyncSource: Debug + Sync { // Sync is supertrait due to https://docs.rs/async-trait/0.1.50/async_trait/index.html#dyn-traits /// Collects all configuration properties available from this source and return - /// a HashMap as an async operations. - async fn collect(&self) -> Result>; + /// a LinkedHashMap as an async operations. + async fn collect(&self) -> Result>; /// Collects all configuration properties to a provided cache. async fn collect_to(&self, cache: &mut Value) -> Result<()> { @@ -86,8 +86,8 @@ impl Source for Vec> { Box::new((*self).clone()) } - fn collect(&self) -> Result> { - let mut cache: Value = HashMap::::new().into(); + fn collect(&self) -> Result> { + let mut cache: Value = LinkedHashMap::::new().into(); for source in self { source.collect_to(&mut cache)?; @@ -106,8 +106,8 @@ impl Source for [Box] { Box::new(self.to_owned()) } - fn collect(&self) -> Result> { - let mut cache: Value = HashMap::::new().into(); + fn collect(&self) -> Result> { + let mut cache: Value = LinkedHashMap::::new().into(); for source in self { source.collect_to(&mut cache)?; @@ -131,8 +131,8 @@ where Box::new((*self).clone()) } - fn collect(&self) -> Result> { - let mut cache: Value = HashMap::::new().into(); + fn collect(&self) -> Result> { + let mut cache: Value = LinkedHashMap::::new().into(); for source in self { source.collect_to(&mut cache)?; diff --git a/src/value.rs b/src/value.rs index 8db5fcc..e8f41c9 100644 --- a/src/value.rs +++ b/src/value.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::fmt; use std::fmt::Display; @@ -23,7 +23,7 @@ pub enum ValueKind { } pub type Array = Vec; -pub type Table = HashMap; +pub type Table = LinkedHashMap; impl Default for ValueKind { fn default() -> Self { @@ -73,11 +73,11 @@ impl From for ValueKind { } } -impl From> for ValueKind +impl From> for ValueKind where T: Into, { - fn from(values: HashMap) -> Self { + fn from(values: LinkedHashMap) -> Self { let t = values.into_iter().map(|(k, v)| (k, v.into())).collect(); ValueKind::Table(t) } @@ -357,7 +357,7 @@ impl Value { /// If the `Value` is a Table, returns the associated Map. // FIXME: Should this not be `try_into_*` ? - pub fn into_table(self) -> Result> { + pub fn into_table(self) -> Result> { match self.kind { ValueKind::Table(value) => Ok(value), diff --git a/tests/async_builder.rs b/tests/async_builder.rs index 5d7d6ba..a614d42 100644 --- a/tests/async_builder.rs +++ b/tests/async_builder.rs @@ -1,5 +1,6 @@ use async_trait::async_trait; use config::*; +use linked_hash_map::LinkedHashMap; use std::{env, fs, path, str::FromStr}; use tokio::{fs::File, io::AsyncReadExt}; @@ -18,7 +19,7 @@ impl AsyncFile { #[async_trait] impl AsyncSource for AsyncFile { - async fn collect(&self) -> Result, ConfigError> { + async fn collect(&self) -> Result, ConfigError> { let mut path = env::current_dir().unwrap(); let local = path::PathBuf::from_str(&self.path).unwrap(); diff --git a/tests/errors.rs b/tests/errors.rs index e11ad69..703dddd 100644 --- a/tests/errors.rs +++ b/tests/errors.rs @@ -5,6 +5,7 @@ extern crate config; #[macro_use] extern crate serde_derive; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -96,7 +97,7 @@ fn test_error_enum_de() { ] .iter() .cloned() - .collect::>() + .collect::>() .into(); let confused_d = confused_v.try_into::(); assert_eq!( diff --git a/tests/file_hjson.rs b/tests/file_hjson.rs index 96fe8b1..c6d9bd5 100644 --- a/tests/file_hjson.rs +++ b/tests/file_hjson.rs @@ -7,7 +7,7 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -21,7 +21,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/file_json.rs b/tests/file_json.rs index 4e5edbc..c3ebe06 100644 --- a/tests/file_json.rs +++ b/tests/file_json.rs @@ -7,7 +7,7 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -21,7 +21,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/file_json5.rs b/tests/file_json5.rs index 0bf5138..f92bce5 100644 --- a/tests/file_json5.rs +++ b/tests/file_json5.rs @@ -9,7 +9,7 @@ extern crate serde_derive; use config::*; use float_cmp::ApproxEqUlps; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; #[derive(Debug, Deserialize)] @@ -20,7 +20,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/file_ron.rs b/tests/file_ron.rs index c901419..71b9106 100644 --- a/tests/file_ron.rs +++ b/tests/file_ron.rs @@ -7,7 +7,7 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -22,7 +22,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/file_toml.rs b/tests/file_toml.rs index 7c57c4b..77d4d31 100644 --- a/tests/file_toml.rs +++ b/tests/file_toml.rs @@ -7,7 +7,7 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -22,7 +22,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/file_yaml.rs b/tests/file_yaml.rs index 2ea9db4..4b1c108 100644 --- a/tests/file_yaml.rs +++ b/tests/file_yaml.rs @@ -7,7 +7,7 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use config::*; @@ -21,7 +21,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/get.rs b/tests/get.rs index 99f9c84..43a126a 100644 --- a/tests/get.rs +++ b/tests/get.rs @@ -7,7 +7,8 @@ extern crate serde; #[macro_use] extern crate serde_derive; -use std::collections::{HashMap, HashSet}; +use linked_hash_map::LinkedHashMap; +use std::collections::HashSet; use config::*; use float_cmp::ApproxEqUlps; @@ -107,7 +108,7 @@ fn test_get_scalar_path_subscript() { #[test] fn test_map() { let c = make(); - let m: HashMap = c.get("place").unwrap(); + let m: LinkedHashMap = c.get("place").unwrap(); assert_eq!(m.len(), 8); assert_eq!( @@ -120,7 +121,7 @@ fn test_map() { #[test] fn test_map_str() { let c = make(); - let m: HashMap = c.get("place.creator").unwrap(); + let m: LinkedHashMap = c.get("place.creator").unwrap(); assert_eq!( m.into_iter().collect::>(), @@ -136,7 +137,7 @@ fn test_map_str() { fn test_map_struct() { #[derive(Debug, Deserialize)] struct Settings { - place: HashMap, + place: LinkedHashMap, } let c = make(); @@ -221,7 +222,7 @@ fn test_enum() { } #[derive(Debug, Deserialize)] struct Settings { - diodes: HashMap, + diodes: LinkedHashMap, } let c = make(); @@ -254,7 +255,7 @@ fn test_enum_key() { #[derive(Debug, Deserialize)] struct Settings { - proton: HashMap, + proton: LinkedHashMap, // Just to make sure that set keys work too. quarks: HashSet, } @@ -270,7 +271,7 @@ fn test_enum_key() { fn test_int_key() { #[derive(Debug, Deserialize, PartialEq)] struct Settings { - divisors: HashMap, + divisors: LinkedHashMap, } let c = make(); diff --git a/tests/legacy/errors.rs b/tests/legacy/errors.rs index 9058c80..070eb6d 100644 --- a/tests/legacy/errors.rs +++ b/tests/legacy/errors.rs @@ -2,6 +2,7 @@ extern crate config; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -93,7 +94,7 @@ fn test_error_enum_de() { ] .iter() .cloned() - .collect::>() + .collect::>() .into(); let confused_d = confused_v.try_into::(); assert_eq!( diff --git a/tests/legacy/file_hjson.rs b/tests/legacy/file_hjson.rs index ecc5165..2f5717f 100644 --- a/tests/legacy/file_hjson.rs +++ b/tests/legacy/file_hjson.rs @@ -4,7 +4,7 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -18,7 +18,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/legacy/file_json.rs b/tests/legacy/file_json.rs index 0ad2c8c..6a9b577 100644 --- a/tests/legacy/file_json.rs +++ b/tests/legacy/file_json.rs @@ -4,7 +4,7 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -18,7 +18,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/legacy/file_ron.rs b/tests/legacy/file_ron.rs index 912f654..bfd31af 100644 --- a/tests/legacy/file_ron.rs +++ b/tests/legacy/file_ron.rs @@ -4,7 +4,7 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -19,7 +19,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/legacy/file_toml.rs b/tests/legacy/file_toml.rs index 13e3590..24c590e 100644 --- a/tests/legacy/file_toml.rs +++ b/tests/legacy/file_toml.rs @@ -4,7 +4,7 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -19,7 +19,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/legacy/file_yaml.rs b/tests/legacy/file_yaml.rs index 930a6f7..af04ef6 100644 --- a/tests/legacy/file_yaml.rs +++ b/tests/legacy/file_yaml.rs @@ -4,7 +4,7 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::HashMap; +use linked_hash_map::LinkedHashMap; use std::path::PathBuf; use self::config::*; @@ -18,7 +18,7 @@ struct Place { favorite: bool, telephone: Option, reviews: u64, - creator: HashMap, + creator: LinkedHashMap, rating: Option, } diff --git a/tests/legacy/get.rs b/tests/legacy/get.rs index fe11657..c246567 100644 --- a/tests/legacy/get.rs +++ b/tests/legacy/get.rs @@ -4,7 +4,8 @@ extern crate config; extern crate float_cmp; extern crate serde; -use std::collections::{HashMap, HashSet}; +use linked_hash_map::LinkedHashMap; +use std::collections::HashSet; use self::config::*; use self::float_cmp::ApproxEqUlps; @@ -105,7 +106,7 @@ fn test_get_scalar_path_subscript() { #[test] fn test_map() { let c = make(); - let m: HashMap = c.get("place").unwrap(); + let m: LinkedHashMap = c.get("place").unwrap(); assert_eq!(m.len(), 8); assert_eq!( @@ -118,7 +119,7 @@ fn test_map() { #[test] fn test_map_str() { let c = make(); - let m: HashMap = c.get("place.creator").unwrap(); + let m: LinkedHashMap = c.get("place.creator").unwrap(); assert_eq!( m.into_iter().collect::>(), @@ -134,7 +135,7 @@ fn test_map_str() { fn test_map_struct() { #[derive(Debug, Deserialize)] struct Settings { - place: HashMap, + place: LinkedHashMap, } let c = make(); @@ -219,7 +220,7 @@ fn test_enum() { } #[derive(Debug, Deserialize)] struct Settings { - diodes: HashMap, + diodes: LinkedHashMap, } let c = make(); @@ -252,7 +253,7 @@ fn test_enum_key() { #[derive(Debug, Deserialize)] struct Settings { - proton: HashMap, + proton: LinkedHashMap, // Just to make sure that set keys work too. quarks: HashSet, } @@ -268,7 +269,7 @@ fn test_enum_key() { fn test_int_key() { #[derive(Debug, Deserialize, PartialEq)] struct Settings { - divisors: HashMap, + divisors: LinkedHashMap, } let c = make(); diff --git a/tests/legacy/merge.rs b/tests/legacy/merge.rs index a489bdf..75cb16d 100644 --- a/tests/legacy/merge.rs +++ b/tests/legacy/merge.rs @@ -2,9 +2,8 @@ extern crate config; -use std::collections::HashMap; - use self::config::*; +use linked_hash_map::LinkedHashMap; fn make() -> Config { let mut c = Config::default(); @@ -25,7 +24,7 @@ fn test_merge() { assert_eq!(c.get("production").ok(), Some(true)); assert_eq!(c.get("place.rating").ok(), Some(4.9)); - let m: HashMap = c.get("place.creator").unwrap(); + let m: LinkedHashMap = c.get("place.creator").unwrap(); assert_eq!( m.into_iter().collect::>(), vec![ diff --git a/tests/merge.rs b/tests/merge.rs index 8d09417..922ae31 100644 --- a/tests/merge.rs +++ b/tests/merge.rs @@ -2,9 +2,8 @@ extern crate config; -use std::collections::HashMap; - use config::*; +use linked_hash_map::LinkedHashMap; fn make() -> Config { Config::builder() @@ -22,7 +21,7 @@ fn test_merge() { assert_eq!(c.get("production").ok(), Some(true)); assert_eq!(c.get("place.rating").ok(), Some(4.9)); - let m: HashMap = c.get("place.creator").unwrap(); + let m: LinkedHashMap = c.get("place.creator").unwrap(); assert_eq!( m.into_iter().collect::>(), vec![ -- cgit v1.2.3