@@ -2,7 +2,7 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
2
2
use serde:: { de, Deserialize , Deserializer } ;
3
3
4
4
use crate :: parser:: { self , Key as Keys , Modifier , Node } ;
5
- use super :: Key ;
5
+ use super :: { Key , NodeModifiers } ;
6
6
7
7
pub type KeyMap = Key < KeyEvent > ;
8
8
@@ -12,7 +12,7 @@ pub fn parse(s: &str) -> Result<KeyMap, pom::Error> {
12
12
13
13
impl From < KeyEvent > for KeyMap {
14
14
fn from ( value : KeyEvent ) -> Self {
15
- Self { event : value, node : None }
15
+ Self { event : value, node : Some ( Node :: from ( value ) ) }
16
16
}
17
17
}
18
18
@@ -25,6 +25,38 @@ impl From<Node> for KeyMap {
25
25
}
26
26
}
27
27
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
+
28
60
impl < ' a > From < & ' a Node > for KeyEvent {
29
61
fn from ( node : & ' a Node ) -> Self {
30
62
let key = match node. key {
@@ -48,26 +80,37 @@ impl<'a> From<&'a Node> for KeyEvent {
48
80
Keys :: Up => KeyCode :: Up . into ( ) ,
49
81
} ;
50
82
51
- Self :: new ( key, modifiers ( node. modifiers ) )
83
+ Self :: new ( key, NodeModifiers :: from ( node. modifiers ) . into ( ) )
52
84
}
53
85
}
54
86
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
+ } ) )
68
102
}
103
+ }
69
104
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
+ }
71
114
}
72
115
73
116
/// Deserializes into Key
@@ -86,10 +129,10 @@ mod tests {
86
129
use crossterm:: event:: { KeyCode , KeyEvent , KeyModifiers } ;
87
130
use serde:: Deserialize ;
88
131
89
- use crate :: backend:: {
132
+ use crate :: { backend:: {
90
133
crossterm:: { parse, KeyMap } ,
91
134
Key
92
- } ;
135
+ } , parser :: { Node , self } } ;
93
136
94
137
#[ test]
95
138
fn test_parse ( ) {
@@ -110,6 +153,24 @@ mod tests {
110
153
} ) ;
111
154
}
112
155
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
+
113
174
#[ test]
114
175
fn test_deserialize ( ) {
115
176
use std:: collections:: HashMap ;
0 commit comments