diff options
| author | Teddy Wing | 2018-08-19 00:49:35 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2018-08-19 01:01:58 +0200 | 
| commit | afe9548b1d8fddb5492f492336afb8cc9944919f (patch) | |
| tree | cb7b7f1d7c7107edd479111936e3477a44c20dcd | |
| parent | f026d7521f17736fe4f44c1ab052328d423f3a5c (diff) | |
| download | dome-key-map-afe9548b1d8fddb5492f492336afb8cc9944919f.tar.bz2 | |
map_collection(): Handle whitespace between map definitions
Add support for blank, whitespace, and comment lines between and around
map definition lines.
Fiddled with the existing functions I had for this, but finally managed
to get it working, still using Combine's `examples/ini.rs` as a
reference.
| -rw-r--r-- | src/lib.rs | 39 | 
1 files changed, 29 insertions, 10 deletions
| @@ -129,12 +129,9 @@ where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    let comment = comment().map(|_| ()); -    let blank = skip_many(newline()).or(comment); -      ( -        blank, -        many::<Vec<Map>, _>(map()), +        blank(), +        many::<Vec<Map>, _>(map().skip(blank())),      ).map(|(_, collection)| {          let mut maps = HashMap::new(); @@ -157,15 +154,24 @@ where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    skip_many( -        ( -            token('#'), -            skip_many(satisfy(|c| c != '\n')), -        )// .map(|_| ()) +    ( +        token('#'), +        skip_many(satisfy(|c| c != '\n')),      )  } +fn blank<I>() -> impl Parser<Input = I> +where +    I: Stream<Item = char>, +    I::Error: ParseError<I::Item, I::Range, I::Position>, +{ +    let comment = comment().map(|_| ()); +    let whitespace = whitespace_separator().map(|_| ()); +    skip_many(skip_many1(newline()).or(whitespace).or(comment)) +} + +  #[cfg(test)]  mod tests {      use super::*; @@ -241,7 +247,13 @@ mod tests {      #[test]      fn map_collection_parses_maps() {          let text = " +# Test comment +    # continued +  map <up><down> test +map <play> salt and pepper + +# Another comment  cmd <down> /usr/bin/say 'hello'  ";          let result = map_collection().easy_parse(text).map(|t| t.0); @@ -255,6 +267,13 @@ cmd <down> /usr/bin/say 'hello'              },          );          expected.insert( +            vec![HeadphoneButton::Play], +            MapAction { +                action: "salt and pepper".to_owned(), +                kind: MapKind::Map, +            }, +        ); +        expected.insert(              vec![HeadphoneButton::Down],              MapAction {                  action: "/usr/bin/say 'hello'".to_owned(), | 
