@@ -65,17 +65,24 @@ impl Parser {
6565 while self . current < self . tokens . len ( ) && self . peek ( ) ?. token_type != TokenType :: LineTail {
6666 let name_token = self . consume ( TokenType :: Name ) ?;
6767 let name_str = name_token. value . clone ( ) ;
68-
68+ let mut binds = vec ! [ ] ;
69+ binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & name_str) ) ) ;
6970 let mut attr = get_default_width ( & name_str) ;
7071
72+ while self . peek ( ) ?. token_type == TokenType :: Comma {
73+ self . consume ( TokenType :: Comma ) ?;
74+ let name_token = self . consume ( TokenType :: Name ) ?;
75+ let name_str = name_token. value . clone ( ) ;
76+ binds. push ( ( Arc :: from ( name_str. as_str ( ) ) , get_rdev_key ( & name_str) ) ) ;
77+ }
78+
7179 if self . peek ( ) ?. token_type == TokenType :: LBracket {
7280 self . parse_attr ( & mut attr) ?;
7381 }
7482
7583 row. push ( Button {
76- rdev_key : get_rdev_key ( & name_str) ,
7784 width : attr. width ,
78- name : Arc :: from ( name_str . as_str ( ) ) ,
85+ binds ,
7986 } ) ;
8087
8188 self . consume ( TokenType :: Split ) ?;
@@ -151,7 +158,7 @@ fn get_rdev_key(name: &str) -> Option<Key> {
151158 "x" => Some ( Key :: KeyX ) ,
152159 "c" => Some ( Key :: KeyC ) ,
153160 "v" => Some ( Key :: KeyV ) ,
154- "b" => Some ( Key :: KeyN ) ,
161+ "b" => Some ( Key :: KeyB ) ,
155162 "n" => Some ( Key :: KeyN ) ,
156163 "m" => Some ( Key :: KeyM ) ,
157164 "ctrl" | "lctrl" => Some ( Key :: ControlLeft ) ,
@@ -215,10 +222,10 @@ mod tests {
215222 let result = parser. parse ( ) . unwrap ( ) ;
216223
217224 assert_eq ! ( result. layer. len( ) , 1 ) ;
218- assert_eq ! ( result. layer[ 0 ] [ 0 ] . name . as_ref( ) , "Tab" ) ;
219- assert_eq ! ( result. layer[ 0 ] [ 0 ] . rdev_key , Some ( Key :: Tab ) ) ;
220- assert_eq ! ( result. layer[ 0 ] [ 1 ] . name . as_ref( ) , "P" ) ;
221- assert_eq ! ( result. layer[ 0 ] [ 1 ] . rdev_key , Some ( Key :: KeyP ) ) ;
225+ assert_eq ! ( result. layer[ 0 ] [ 0 ] . binds [ 0 ] . 0 . as_ref( ) , "Tab" ) ;
226+ assert_eq ! ( result. layer[ 0 ] [ 0 ] . binds [ 0 ] . 1 , Some ( Key :: Tab ) ) ;
227+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds [ 0 ] . 0 . as_ref( ) , "P" ) ;
228+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds [ 0 ] . 1 , Some ( Key :: KeyP ) ) ;
222229 }
223230
224231 #[ test]
@@ -320,12 +327,65 @@ mod tests {
320327 let result = parser. parse ( ) . unwrap ( ) ;
321328
322329 assert_eq ! ( result. layer. len( ) , 1 ) ;
323- assert_eq ! ( result. layer[ 0 ] [ 0 ] . name . as_ref( ) , "Tab" ) ;
324- assert_eq ! ( result. layer[ 0 ] [ 0 ] . rdev_key , Some ( Key :: Tab ) ) ;
330+ assert_eq ! ( result. layer[ 0 ] [ 0 ] . binds [ 0 ] . 0 . as_ref( ) , "Tab" ) ;
331+ assert_eq ! ( result. layer[ 0 ] [ 0 ] . binds [ 0 ] . 1 , Some ( Key :: Tab ) ) ;
325332 assert_eq ! ( result. layer[ 0 ] [ 0 ] . width, 10 ) ;
326- assert_eq ! ( result. layer[ 0 ] [ 1 ] . name. as_ref( ) , "P" ) ;
327- assert_eq ! ( result. layer[ 0 ] [ 1 ] . rdev_key, Some ( Key :: KeyP ) ) ;
333+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds[ 0 ] . 0 . as_ref( ) , "P" ) ;
334+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds[ 0 ] . 1 , Some ( Key :: KeyP ) ) ;
335+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . width, 4 ) ;
336+ }
337+
338+ #[ test]
339+ fn test_multi_binds ( ) {
340+ // Input sequence for: :| A, C, D| B | -
341+ let tokens = vec ! [
342+ Token {
343+ token_type: TokenType :: LineHead ,
344+ value: ":" . into( ) ,
345+ } ,
346+ Token {
347+ token_type: TokenType :: Split ,
348+ value: "|" . into( ) ,
349+ } ,
350+ t_name( "A" ) ,
351+ Token {
352+ token_type: TokenType :: Comma ,
353+ value: "," . into( ) ,
354+ } ,
355+ t_name( "C" ) ,
356+ Token {
357+ token_type: TokenType :: Comma ,
358+ value: "," . into( ) ,
359+ } ,
360+ t_name( "D" ) ,
361+ Token {
362+ token_type: TokenType :: Split ,
363+ value: "|" . into( ) ,
364+ } ,
365+ t_name( "B" ) ,
366+ Token {
367+ token_type: TokenType :: Split ,
368+ value: "|" . into( ) ,
369+ } ,
370+ Token {
371+ token_type: TokenType :: LineTail ,
372+ value: "-" . into( ) ,
373+ } ,
374+ ] ;
375+
376+ let mut parser = Parser :: new ( tokens) ;
377+ let result = parser. parse ( ) . unwrap ( ) ;
378+
379+ assert_eq ! ( result. layer. len( ) , 1 ) ;
380+ assert_eq ! ( result. layer[ 0 ] [ 0 ] . binds, [
381+ ( Arc :: from( "A" ) , Some ( Key :: KeyA ) ) ,
382+ ( Arc :: from( "C" ) , Some ( Key :: KeyC ) ) ,
383+ ( Arc :: from( "D" ) , Some ( Key :: KeyD ) ) ,
384+ ] ) ;
385+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds[ 0 ] . 0 . as_ref( ) , "B" ) ;
386+ assert_eq ! ( result. layer[ 0 ] [ 1 ] . binds[ 0 ] . 1 , Some ( Key :: KeyB ) ) ;
328387 assert_eq ! ( result. layer[ 0 ] [ 1 ] . width, 4 ) ;
329388 }
330389
390+
331391}
0 commit comments