@@ -2,7 +2,7 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
22use serde:: { de, Deserialize , Deserializer } ;
33
44use crate :: parser:: { self , Key as Keys , Modifier , Node } ;
5- use super :: Key ;
5+ use super :: { Key , NodeModifiers } ;
66
77pub type KeyMap = Key < KeyEvent > ;
88
@@ -12,7 +12,7 @@ pub fn parse(s: &str) -> Result<KeyMap, pom::Error> {
1212
1313impl From < KeyEvent > for KeyMap {
1414 fn from ( value : KeyEvent ) -> Self {
15- Self { event : value, node : None }
15+ Self { event : value, node : Some ( Node :: from ( value ) ) }
1616 }
1717}
1818
@@ -25,6 +25,38 @@ impl From<Node> for KeyMap {
2525 }
2626}
2727
28+ impl From < KeyEvent > for Node {
29+ fn from ( value : KeyEvent ) -> Self {
30+ match value {
31+ KeyEvent { code, modifiers, .. } => {
32+ let key = match code {
33+ KeyCode :: BackTab => Keys :: BackTab ,
34+ KeyCode :: Backspace => Keys :: Backspace ,
35+ KeyCode :: Char ( ' ' ) => Keys :: Space ,
36+ KeyCode :: Char ( c) => Keys :: Char ( c) ,
37+ KeyCode :: Delete => Keys :: Delete ,
38+ KeyCode :: Down => Keys :: Down ,
39+ KeyCode :: End => Keys :: End ,
40+ KeyCode :: Enter => Keys :: Enter ,
41+ KeyCode :: Esc => Keys :: Esc ,
42+ KeyCode :: F ( n) => Keys :: F ( n) ,
43+ KeyCode :: Home => Keys :: Home ,
44+ KeyCode :: Insert => Keys :: Insert ,
45+ KeyCode :: Left => Keys :: Left ,
46+ KeyCode :: PageDown => Keys :: PageDown ,
47+ KeyCode :: PageUp => Keys :: PageUp ,
48+ KeyCode :: Right => Keys :: Right ,
49+ KeyCode :: Tab => Keys :: Tab ,
50+ KeyCode :: Up => Keys :: Up ,
51+ code => panic ! ( "Unsupport KeyEvent {code:?}" ) ,
52+ } ;
53+
54+ Self { key, modifiers : NodeModifiers :: from ( modifiers) . into ( ) }
55+ }
56+ }
57+ }
58+ }
59+
2860impl < ' a > From < & ' a Node > for KeyEvent {
2961 fn from ( node : & ' a Node ) -> Self {
3062 let key = match node. key {
@@ -48,26 +80,37 @@ impl<'a> From<&'a Node> for KeyEvent {
4880 Keys :: Up => KeyCode :: Up . into ( ) ,
4981 } ;
5082
51- Self :: new ( key, modifiers ( node. modifiers ) )
83+ Self :: new ( key, NodeModifiers :: from ( node. modifiers ) . into ( ) )
5284 }
5385}
5486
55- fn modifiers ( m : u8 ) -> KeyModifiers {
56- let mut mods = KeyModifiers :: NONE ;
57- if m & Modifier :: Alt as u8 != 0 {
58- mods |= KeyModifiers :: ALT
59- }
60- if m & Modifier :: Cmd as u8 != 0 {
61- mods |= KeyModifiers :: META
62- }
63- if m & Modifier :: Ctrl as u8 != 0 {
64- mods |= KeyModifiers :: CONTROL
65- }
66- if m & Modifier :: Shift as u8 != 0 {
67- mods |= KeyModifiers :: SHIFT
87+ const MODIFIERS : [ ( KeyModifiers , parser:: Modifier ) ; 4 ] = [
88+ ( KeyModifiers :: ALT , Modifier :: Alt ) ,
89+ ( KeyModifiers :: CONTROL , Modifier :: Ctrl ) ,
90+ ( KeyModifiers :: META , Modifier :: Cmd ) ,
91+ ( KeyModifiers :: SHIFT , Modifier :: Shift ) ,
92+ ] ;
93+
94+ impl From < KeyModifiers > for NodeModifiers {
95+ fn from ( value : KeyModifiers ) -> Self {
96+ Self ( MODIFIERS . into_iter ( ) . fold ( 0 , |mut m, ( m1, m2) | {
97+ if value. contains ( m1) {
98+ m |= m2 as u8 ;
99+ }
100+ m
101+ } ) )
68102 }
103+ }
69104
70- mods
105+ impl From < NodeModifiers > for KeyModifiers {
106+ fn from ( value : NodeModifiers ) -> Self {
107+ MODIFIERS . into_iter ( ) . fold ( KeyModifiers :: NONE , |mut m, ( m1, m2) | {
108+ if value. 0 & m2 as u8 != 0 {
109+ m|= m1
110+ }
111+ m
112+ } )
113+ }
71114}
72115
73116/// Deserializes into Key
@@ -86,10 +129,10 @@ mod tests {
86129 use crossterm:: event:: { KeyCode , KeyEvent , KeyModifiers } ;
87130 use serde:: Deserialize ;
88131
89- use crate :: backend:: {
132+ use crate :: { backend:: {
90133 crossterm:: { parse, KeyMap } ,
91134 Key
92- } ;
135+ } , parser :: { Node , self } } ;
93136
94137 #[ test]
95138 fn test_parse ( ) {
@@ -110,6 +153,24 @@ mod tests {
110153 } ) ;
111154 }
112155
156+ #[ test]
157+ fn test_from_key_to_node ( ) {
158+ let alt_a = KeyEvent :: new (
159+ KeyCode :: Char ( 'a' ) ,
160+ KeyModifiers :: ALT | KeyModifiers :: CONTROL | KeyModifiers :: SHIFT ,
161+ ) ;
162+
163+ [
164+ ( KeyEvent :: from ( KeyCode :: Char ( '[' ) ) , "[" ) ,
165+ ( KeyEvent :: from ( KeyCode :: Delete ) , "del" ) ,
166+ ( alt_a, "alt-ctrl-shift-a" ) ,
167+ ]
168+ . map ( |( key, code) | {
169+ let node = parser:: parse ( code) . unwrap ( ) ;
170+ assert_eq ! ( Node :: from( key) , node) ;
171+ } ) ;
172+ }
173+
113174 #[ test]
114175 fn test_deserialize ( ) {
115176 use std:: collections:: HashMap ;
0 commit comments