Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ sudo: true
language: rust
cache: cargo
rust:
- nightly
- beta
- stable
- nightly
- beta
- stable

matrix:
allow_failures:
- rust: nightly

script:
- cargo test
- cargo clippy --tests -- -D warnings
- cargo test
4 changes: 2 additions & 2 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ enum ConfigKind {
Mutable {
defaults: HashMap<path::Expression, Value>,
overrides: HashMap<path::Expression, Value>,
sources: Vec<Box<Source + Send + Sync>>,
sources: Vec<Box<dyn Source + Send + Sync>>,
},

// A frozen configuration.
Expand Down Expand Up @@ -212,7 +212,7 @@ impl Config {
}

impl Source for Config {
fn clone_into_box(&self) -> Box<Source + Send + Sync> {
fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> {
Box::new((*self).clone())
}

Expand Down
46 changes: 26 additions & 20 deletions src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use error::*;
use serde::de;
use std::collections::{HashMap, VecDeque};
use std::iter::Enumerate;
use value::{Value, ValueKind, Table};
use value::{Table, Value, ValueKind};

impl<'de> de::Deserializer<'de> for Value {
type Error = ConfigError;
Expand Down Expand Up @@ -125,7 +125,11 @@ impl<'de> de::Deserializer<'de> for Value {
where
V: de::Visitor<'de>,
{
visitor.visit_enum(EnumAccess{ value: self, name: name, variants: variants })
visitor.visit_enum(EnumAccess {
value: self,
name,
variants,
})
}

forward_to_deserialize_any! {
Expand Down Expand Up @@ -178,11 +182,10 @@ impl<'de> de::SeqAccess<'de> for SeqAccess {
T: de::DeserializeSeed<'de>,
{
match self.elements.next() {
Some((idx, value)) => {
seed.deserialize(value)
.map(Some)
.map_err(|e| e.prepend_index(idx))
}
Some((idx, value)) => seed
.deserialize(value)
.map(Some)
.map_err(|e| e.prepend_index(idx)),
None => Ok(None),
}
}
Expand Down Expand Up @@ -229,8 +232,7 @@ impl<'de> de::MapAccess<'de> for MapAccess {
V: de::DeserializeSeed<'de>,
{
let (key, value) = self.elements.pop_front().unwrap();
de::DeserializeSeed::deserialize(seed, value)
.map_err(|e| e.prepend_key(key))
de::DeserializeSeed::deserialize(seed, value).map_err(|e| e.prepend_key(key))
}
}

Expand All @@ -241,12 +243,12 @@ struct EnumAccess {
}

impl EnumAccess {
fn variant_deserializer(&self, name: &String) -> Result<StrDeserializer> {
fn variant_deserializer(&self, name: &str) -> Result<StrDeserializer> {
self.variants
.iter()
.find(|&s| s == name)
.find(|&s| *s == name)
.map(|&s| StrDeserializer(s))
.ok_or(self.no_constructor_error(name))
.ok_or_else(|| self.no_constructor_error(name))
}

fn table_deserializer(&self, table: &Table) -> Result<StrDeserializer> {
Expand Down Expand Up @@ -315,21 +317,21 @@ impl<'de> de::VariantAccess<'de> for EnumAccess {
V: de::Visitor<'de>,
{
match self.value.kind {
ValueKind::Table(t) => de::Deserializer::deserialize_seq(t.into_iter().next().unwrap().1, visitor),
ValueKind::Table(t) => {
de::Deserializer::deserialize_seq(t.into_iter().next().unwrap().1, visitor)
}
_ => unreachable!(),
}
}

fn struct_variant<V>(
self,
_fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value>
fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
where
V: de::Visitor<'de>,
{
match self.value.kind {
ValueKind::Table(t) => de::Deserializer::deserialize_map(t.into_iter().next().unwrap().1, visitor),
ValueKind::Table(t) => {
de::Deserializer::deserialize_map(t.into_iter().next().unwrap().1, visitor)
}
_ => unreachable!(),
}
}
Expand Down Expand Up @@ -448,7 +450,11 @@ impl<'de> de::Deserializer<'de> for Config {
where
V: de::Visitor<'de>,
{
visitor.visit_enum(EnumAccess{ value: self.cache, name: name, variants: variants })
visitor.visit_enum(EnumAccess {
value: self.cache,
name,
variants,
})
}

forward_to_deserialize_any! {
Expand Down
2 changes: 1 addition & 1 deletion src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ impl Default for Environment {
}

impl Source for Environment {
fn clone_into_box(&self) -> Box<Source + Send + Sync> {
fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> {
Box::new((*self).clone())
}

Expand Down
49 changes: 17 additions & 32 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ pub enum ConfigError {

/// The captured error from attempting to parse the file in its desired format.
/// This is the actual error object from the library used for the parsing.
cause: Box<Error + Send + Sync>,
cause: Box<dyn Error + Send + Sync>,
},

/// Value could not be converted into the requested type.
Expand All @@ -76,7 +76,7 @@ pub enum ConfigError {
Message(String),

/// Unadorned error from a foreign origin.
Foreign(Box<Error + Send + Sync>),
Foreign(Box<dyn Error + Send + Sync>),
}

impl ConfigError {
Expand All @@ -88,9 +88,9 @@ impl ConfigError {
expected: &'static str,
) -> Self {
ConfigError::Type {
origin: origin,
unexpected: unexpected,
expected: expected,
origin,
unexpected,
expected,
key: None,
}
}
Expand All @@ -105,9 +105,9 @@ impl ConfigError {
expected,
..
} => ConfigError::Type {
origin: origin,
unexpected: unexpected,
expected: expected,
origin,
unexpected,
expected,
key: Some(key.into()),
},

Expand All @@ -131,14 +131,12 @@ impl ConfigError {
unexpected,
expected,
key,
} => {
ConfigError::Type {
origin,
unexpected,
expected,
key: Some(concat(key)),
}
}
} => ConfigError::Type {
origin,
unexpected,
expected,
key: Some(concat(key)),
},
ConfigError::NotFound(key) => ConfigError::NotFound(concat(Some(key))),
_ => self,
}
Expand Down Expand Up @@ -166,7 +164,8 @@ impl fmt::Debug for ConfigError {
impl fmt::Display for ConfigError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
ConfigError::Frozen | ConfigError::PathParse(_) => write!(f, "{}", self.description()),
ConfigError::Frozen => write!(f, "configuration is frozen"),
ConfigError::PathParse(kind) => writeln!(f, "{}", kind.description()),

ConfigError::Message(ref s) => write!(f, "{}", s),

Expand Down Expand Up @@ -209,21 +208,7 @@ impl fmt::Display for ConfigError {
}

impl Error for ConfigError {
fn description(&self) -> &str {
match *self {
ConfigError::Frozen => "configuration is frozen",
ConfigError::NotFound(_) => "configuration property not found",
ConfigError::Type { .. } => "invalid type",
ConfigError::Foreign(ref cause) | ConfigError::FileParse { ref cause, .. } => {
cause.description()
}
ConfigError::PathParse(ref kind) => kind.description(),

_ => "configuration error",
}
}

fn cause(&self) -> Option<&Error> {
fn cause(&self) -> Option<&dyn Error> {
match *self {
ConfigError::Foreign(ref cause) | ConfigError::FileParse { ref cause, .. } => {
Some(cause.as_ref())
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/hjson.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use value::{Value, ValueKind};
pub fn parse(
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
// 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)?);
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/ini.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use value::{Value, ValueKind};
pub fn parse(
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
let mut map: HashMap<String, Value> = HashMap::new();
let i = Ini::load_from_str(text)?;
for (sec, prop) in i.iter() {
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use value::{Value, ValueKind};
pub fn parse(
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
// 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)?);
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ impl FileFormat {
&self,
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
match *self {
#[cfg(feature = "toml")]
FileFormat::Toml => toml::parse(uri, text),
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/toml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use value::{Value, ValueKind};
pub fn parse(
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
// 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)?);
Expand Down
2 changes: 1 addition & 1 deletion src/file/format/yaml.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use yaml_rust as yaml;
pub fn parse(
uri: Option<&String>,
text: &str,
) -> Result<HashMap<String, Value>, Box<Error + Send + Sync>> {
) -> Result<HashMap<String, Value>, Box<dyn Error + Send + Sync>> {
// Parse a YAML object from file
let mut docs = yaml::YamlLoader::load_from_str(text)?;
let root = match docs.len() {
Expand Down
6 changes: 3 additions & 3 deletions src/file/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ where
T: 'static,
T: Sync + Send,
{
fn clone_into_box(&self) -> Box<Source + Send + Sync> {
fn clone_into_box(&self) -> Box<dyn Source + Send + Sync> {
Box::new((*self).clone())
}

Expand All @@ -120,8 +120,8 @@ where
format
.parse(uri.as_ref(), &contents)
.map_err(|cause| ConfigError::FileParse {
uri: uri,
cause: cause,
uri,
cause,
})
}
}
8 changes: 4 additions & 4 deletions src/file/source/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ pub struct FileSourceFile {

impl FileSourceFile {
pub fn new(name: PathBuf) -> FileSourceFile {
FileSourceFile { name: name }
FileSourceFile { name }
}

fn find_file(
&self,
format_hint: Option<FileFormat>,
) -> Result<(PathBuf, FileFormat), Box<Error + Send + Sync>> {
) -> Result<(PathBuf, FileFormat), Box<dyn Error + Send + Sync>> {
// First check for an _exact_ match
let mut filename = env::current_dir()?.as_path().join(self.name.clone());
if filename.is_file() {
Expand Down Expand Up @@ -91,7 +91,7 @@ impl FileSource for FileSourceFile {
fn resolve(
&self,
format_hint: Option<FileFormat>,
) -> Result<(Option<String>, String, FileFormat), Box<Error + Send + Sync>> {
) -> Result<(Option<String>, String, FileFormat), Box<dyn Error + Send + Sync>> {
// Find file
let (filename, format) = self.find_file(format_hint)?;

Expand All @@ -103,7 +103,7 @@ impl FileSource for FileSourceFile {
};

// Read contents from file
let mut file = fs::File::open(filename.clone())?;
let mut file = fs::File::open(filename)?;
let mut text = String::new();
file.read_to_string(&mut text)?;

Expand Down
2 changes: 1 addition & 1 deletion src/file/source/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ pub trait FileSource: Debug + Clone {
fn resolve(
&self,
format_hint: Option<FileFormat>,
) -> Result<(Option<String>, String, FileFormat), Box<Error + Send + Sync>>;
) -> Result<(Option<String>, String, FileFormat), Box<dyn Error + Send + Sync>>;
}
2 changes: 1 addition & 1 deletion src/file/source/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ impl FileSource for FileSourceString {
fn resolve(
&self,
format_hint: Option<FileFormat>,
) -> Result<(Option<String>, String, FileFormat), Box<Error + Send + Sync>> {
) -> Result<(Option<String>, String, FileFormat), Box<dyn Error + Send + Sync>> {
Ok((
None,
self.0.clone(),
Expand Down
Loading