diff options
| -rw-r--r-- | src/parser.rs | 80 | 
1 files changed, 48 insertions, 32 deletions
| diff --git a/src/parser.rs b/src/parser.rs index 2e100df..05d7dd1 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -204,8 +204,20 @@ where      I: Stream<Item = char>,      I::Error: ParseError<I::Item, I::Range, I::Position>,  { -    take_until(newline()) -        .map(|action| Action::String(action)) +    ( +        many( +            choice!( +                satisfy(|c| c != '<') +                    .map(|c| +                        KeyboardKeyWithModifiers::new( +                            KeyboardKey::Character(Character::new(c)), +                            None, +                        ) +                    ), +                special_key() +            ) +        ), +    ).map(|(keys,)| Action::Map(keys))  }  fn special_key<I>() -> impl Parser<Input = I, Output = KeyboardKeyWithModifiers> @@ -228,63 +240,63 @@ where      I::Error: ParseError<I::Item, I::Range, I::Position>,  {      choice!( -        string_case_insensitive("F1") +        try(string_case_insensitive("F1"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F1)), -        string_case_insensitive("F2") +        try(string_case_insensitive("F2"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F2)), -        string_case_insensitive("F3") +        try(string_case_insensitive("F3"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F3)), -        string_case_insensitive("F4") +        try(string_case_insensitive("F4"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F4)), -        string_case_insensitive("F5") +        try(string_case_insensitive("F5"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F5)), -        string_case_insensitive("F6") +        try(string_case_insensitive("F6"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F6)), -        string_case_insensitive("F7") +        try(string_case_insensitive("F7"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F7)), -        string_case_insensitive("F8") +        try(string_case_insensitive("F8"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F8)), -        string_case_insensitive("F9") +        try(string_case_insensitive("F9"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F9)), -        string_case_insensitive("F10") +        try(string_case_insensitive("F10"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F10)), -        string_case_insensitive("F11") +        try(string_case_insensitive("F11"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F11)), -        string_case_insensitive("F12") +        try(string_case_insensitive("F12"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::F12)), -        string_case_insensitive("Left") +        try(string_case_insensitive("Left"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::LeftArrow)), -        string_case_insensitive("Right") +        try(string_case_insensitive("Right"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::RightArrow)), -        string_case_insensitive("Down") +        try(string_case_insensitive("Down"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::DownArrow)), -        string_case_insensitive("Up") +        try(string_case_insensitive("Up"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::UpArrow)), -        string_case_insensitive("Home") +        try(string_case_insensitive("Home"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Home)), -        string_case_insensitive("End") +        try(string_case_insensitive("End"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::End)), -        string_case_insensitive("PageUp") +        try(string_case_insensitive("PageUp"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::PageUp)), -        string_case_insensitive("PageDown") +        try(string_case_insensitive("PageDown"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::PageDown)), -        string_case_insensitive("Return") +        try(string_case_insensitive("Return"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Return)), -        string_case_insensitive("Enter") +        try(string_case_insensitive("Enter"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Return)), -        string_case_insensitive("CR") +        try(string_case_insensitive("CR"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Return)), -        string_case_insensitive("Del") +        try(string_case_insensitive("Del"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Delete)), -        string_case_insensitive("BS") +        try(string_case_insensitive("BS"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Backspace)), -        string_case_insensitive("Esc") +        try(string_case_insensitive("Esc"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Escape)), -        string_case_insensitive("CapsLock") +        try(string_case_insensitive("CapsLock"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::CapsLock)), -        string_case_insensitive("Tab") +        try(string_case_insensitive("Tab"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Tab)), -        string_case_insensitive("Space") +        try(string_case_insensitive("Space"))              .map(|_| KeyCode::new(autopilot::key::KeyCode::Space))      )          // string_case_insensitive("Control") @@ -523,7 +535,7 @@ mod tests {      #[test]      fn action_parses_map_with_special_key() { -        let text = "ready<F2><space>go"; +        let text = "ready<F2><space>go<Esc>";          let expected = Action::Map(vec![              KeyboardKeyWithModifiers::new( @@ -562,6 +574,10 @@ mod tests {                  KeyboardKey::Character(Character::new('o')),                  None,              ), +            KeyboardKeyWithModifiers::new( +                KeyboardKey::KeyCode(KeyCode::new(autopilot::key::KeyCode::Escape)), +                None, +            ),          ]);          let result = action_map().easy_parse(text).map(|t| t.0); | 
