diff options
Diffstat (limited to 'src/parser.rs')
| -rw-r--r-- | src/parser.rs | 101 | 
1 files changed, 47 insertions, 54 deletions
| diff --git a/src/parser.rs b/src/parser.rs index 0ccb05d..0389cf5 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -207,14 +207,20 @@ where      (          many(              choice!( -                action_character(), +                action_character() +                    .map(|c| +                        KeyboardKeyWithModifiers::new( +                            KeyboardKey::Character(Character::new(c)), +                            None, +                        ) +                    ),                  special_key()              )          ),      ).map(|(keys,)| Action::Map(keys))  } -fn action_character<I>() -> impl Parser<Input = I, Output = KeyboardKeyWithModifiers> +fn action_character<I>() -> impl Parser<Input = I, Output = char>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>, @@ -223,12 +229,6 @@ where          satisfy(|c| c != '<' && c != '\\'),          action_escape()      ) -        .map(|c| -            KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new(c)), -                None, -            ) -        )  }  fn action_escape<I>() -> impl Parser<Input = I, Output = char> @@ -247,40 +247,49 @@ where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    between(token('<'), token('>'), ( -        key_modifiers(), -        key_code() -    )) -        .map(|(modifiers, code)| -            KeyboardKeyWithModifiers::new( -                KeyboardKey::KeyCode(code), -                modifiers, -            ) +    between( +        token('<'), +        token('>'), +        or( +            try(( +                many(key_modifier()), +                key_code().map(|code| KeyboardKey::KeyCode(code)), +            )), +            try(( +                many1(key_modifier()), +                action_character().map(|c| +                    KeyboardKey::Character(Character::new(c)) +                ), +            )) +        ) +    ).map(|(modifiers, key): (Vec<Flag>, KeyboardKey)| { +        let modifiers = if modifiers.is_empty() { +            None +        } else { +            Some(modifiers) +        }; + +        KeyboardKeyWithModifiers::new( +            key, +            modifiers,          ) +    })  } -fn key_modifiers<I>() -> impl Parser<Input = I, Output = Option<Vec<Flag>>> +fn key_modifier<I>() -> impl Parser<Input = I, Output = Flag>  where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    many( -        choice!( -            try(string_case_insensitive("D-")) -                .map(|_| Flag::Control), -            try(string_case_insensitive("A-")) -                .map(|_| Flag::Alt), -            try(string_case_insensitive("C-")) -                .map(|_| Flag::Meta), -            try(string_case_insensitive("S-")) -                .map(|_| Flag::Shift) -        ) -    ).map(|modifiers: Vec<Flag>| -        if modifiers.is_empty() { -            None -        } else { -            Some(modifiers) -        } +    choice!( +        try(string_case_insensitive("D-")) +            .map(|_| Flag::Meta), +        try(string_case_insensitive("A-")) +            .map(|_| Flag::Alt), +        try(string_case_insensitive("C-")) +            .map(|_| Flag::Control), +        try(string_case_insensitive("S-")) +            .map(|_| Flag::Shift)      )  } @@ -576,7 +585,7 @@ mod tests {      #[test]      fn action_parses_map_with_modifier() { -        let text = "one<C-l>two<D-s>three"; +        let text = "one<C-l>two<D-s><A-Left>";          let expected = Action::Map(vec![              KeyboardKeyWithModifiers::new( @@ -612,24 +621,8 @@ mod tests {                  Some(vec![Flag::Meta]),              ),              KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new('t')), -                None, -            ), -            KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new('h')), -                None, -            ), -            KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new('r')), -                None, -            ), -            KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new('e')), -                None, -            ), -            KeyboardKeyWithModifiers::new( -                KeyboardKey::Character(Character::new('e')), -                None, +                KeyboardKey::KeyCode(KeyCode::new(autopilot::key::KeyCode::LeftArrow)), +                Some(vec![Flag::Alt]),              ),          ]);          let result = action_map().easy_parse(text).map(|t| t.0); | 
