@@ -77,6 +77,10 @@ impl Parser {
7777 let num = self . consume ( TokenType :: Number ) ?;
7878 Ok ( Value :: Number ( num. value . parse ( ) ?) )
7979 }
80+ TokenType :: Name => {
81+ let str = self . consume ( TokenType :: Name ) ?;
82+ Ok ( Value :: Str ( str. value . clone ( ) . into ( ) ) )
83+ }
8084 TokenType :: At => {
8185 self . consume ( TokenType :: At ) ?;
8286 self . consume ( TokenType :: LParen ) ?;
@@ -96,7 +100,7 @@ impl Parser {
96100 let ident = self . consume ( TokenType :: Ident ) ?;
97101 let name = ident. value . clone ( ) ;
98102 match env. get ( name. as_str ( ) ) {
99- Some ( v) => Ok ( * v ) ,
103+ Some ( v) => Ok ( v . clone ( ) ) ,
100104 None => Err ( ParserError :: Err ( format ! ( "Unbounded Variable {:?}." , name) ) ) ,
101105 }
102106 }
@@ -161,7 +165,7 @@ impl Parser {
161165 }
162166
163167 fn parse_attr ( & mut self , attr : & mut Attr , env : & Env ) -> Result < ( ) , ParserError > {
164- // [width, border_color, highlight]
168+ // [width, border_color, highlight, alignment ]
165169 self . consume ( TokenType :: LBracket ) ?;
166170
167171 let mut pos = 0 ;
@@ -200,6 +204,15 @@ impl Parser {
200204 return Err ( ParserError :: Err ( "Highlight must be RGB" . into ( ) ) ) ;
201205 }
202206 }
207+ 3 => {
208+ // alignment
209+ if let Value :: Str ( v) = self . parse_value ( env) ? {
210+ attr. alignment = Some ( v) ;
211+ } else {
212+ return Err ( ParserError :: Err ( "Alignment must be Name" . into ( ) ) ) ;
213+ }
214+ }
215+
203216 _ => {
204217 self . advance ( ) ?;
205218 }
@@ -589,6 +602,7 @@ mod tests {
589602
590603 // #id = $10
591604 // #color = @($1, $2, $3)
605+ // #str = "hi"
592606 // :| A, C, D | B |-
593607 let tokens = vec ! [
594608 Token {
@@ -643,6 +657,18 @@ mod tests {
643657 token_type: TokenType :: RParen ,
644658 value: ")" . into( ) ,
645659 } ,
660+ Token {
661+ token_type: TokenType :: Ident ,
662+ value: "str" . into( ) ,
663+ } ,
664+ Token {
665+ token_type: TokenType :: Equal ,
666+ value: "=" . into( ) ,
667+ } ,
668+ Token {
669+ token_type: TokenType :: Name ,
670+ value: "hi" . into( ) ,
671+ } ,
646672 Token {
647673 token_type: TokenType :: LineHead ,
648674 value: ":" . into( ) ,
@@ -694,6 +720,11 @@ mod tests {
694720 _ => panic ! ( "Variable 'color' not found or wrong type" ) ,
695721 }
696722
723+ match env. get ( "str" ) {
724+ Some ( Value :: Str ( v) ) => assert_eq ! ( * v, "hi" . into( ) ) ,
725+ _ => panic ! ( "Variable 'str' not found or wrong type" ) ,
726+ }
727+
697728 assert_eq ! ( result. layer. len( ) , 1 ) ;
698729
699730 let button_1 = & result. layer [ 0 ] [ 0 ] ;
0 commit comments