diff options
author | Yehuda Katz + Carl Lerche <engineering@tilde.io> | 2014-07-02 17:23:35 -0700 |
---|---|---|
committer | Tim Carey-Smith <tim@spork.in> | 2014-07-02 17:23:35 -0700 |
commit | 806a7bd93701d8634fc1cf011c8fa9b89fa80e43 (patch) | |
tree | 8a13d81ae576f014d745d466bad9d53640633c26 /src | |
parent | e32363c788e184ed2c2df22201b864096c053fa9 (diff) | |
download | milf-rs-806a7bd93701d8634fc1cf011c8fa9b89fa80e43.tar.gz milf-rs-806a7bd93701d8634fc1cf011c8fa9b89fa80e43.zip |
Decodes `foo-bar` into a field named `foo_bar`
This logic is specific to the Decoder, and because Rust does not support
hyphenated names as identifiers, it's the only reasonable thing to do
with hyphenated names in Toml.
Diffstat (limited to 'src')
-rw-r--r-- | src/serialization.rs | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/serialization.rs b/src/serialization.rs index 9b5ddfd..94bd201 100644 --- a/src/serialization.rs +++ b/src/serialization.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::mem; use std::fmt; +use std::str; use serialize; use {Value, Table, Array, String, Integer, Float, Boolean, Parser}; @@ -555,7 +556,10 @@ impl serialize::Decoder<DecodeError> for Decoder { -> Result<T, DecodeError> { let field = f_name.to_string(); let toml = match self.toml { - Some(Table(ref mut table)) => table.pop(&field), + Some(Table(ref mut table)) => { + table.pop(&field) + .or_else(|| table.pop(&hyphenate(f_name))) + }, ref found => return Err(self.mismatch("table", found)), }; let mut d = self.sub_decoder(toml, f_name); @@ -694,6 +698,10 @@ impl serialize::Decoder<DecodeError> for Decoder { } } +fn hyphenate(string: &str) -> String { + str::replace(string, "_", "-") +} + impl fmt::Show for DecodeError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { try!(match self.kind { |