@@ -6,13 +6,20 @@ use crate::utils::{unknown_rule_error, OwnedSpan};
66use crate :: { parse_directive, parse_value_type, Directive , ValueType } ;
77use pest:: iterators:: Pair ;
88
9+ #[ derive( Debug , Clone , PartialEq ) ]
10+ pub enum ArgumentDefaultValue {
11+ None ,
12+ ValueData ( ValueData ) ,
13+ Identifier ( Identifier ) ,
14+ }
15+
916#[ derive( Debug , Clone , PartialEq ) ]
1017pub struct Argument {
1118 pub span : OwnedSpan ,
1219 pub name : Identifier ,
1320 pub description : String ,
1421 pub value_type : ValueType ,
15- pub default : Option < ValueData > ,
22+ pub default : ArgumentDefaultValue ,
1623 pub directives : Vec < Directive > ,
1724}
1825
@@ -23,7 +30,7 @@ impl Argument {
2330 name : Identifier :: from ( name) ,
2431 description : "" . to_string ( ) ,
2532 value_type : t,
26- default : None ,
33+ default : ArgumentDefaultValue :: None ,
2734 directives : Vec :: new ( ) ,
2835 }
2936 }
@@ -53,8 +60,8 @@ impl Argument {
5360 self . clone ( )
5461 }
5562
56- pub fn default ( & mut self , value_data : ValueData ) -> Self {
57- self . default = Some ( value_data ) ;
63+ pub fn default ( & mut self , default : ArgumentDefaultValue ) -> Self {
64+ self . default = default ;
5865 self . clone ( )
5966 }
6067
@@ -75,11 +82,13 @@ fn parse_argument(pair: Pair<Rule>, file: &str) -> Result<Argument, Box<RuleErro
7582 // at this moment we are on [identifier, value]
7683 let name = parse_identifier ( next. unwrap ( ) , file) ?;
7784 let value = parse_value_type ( childs. next ( ) . unwrap ( ) , file) ?;
78- let mut default = None ;
85+ let mut default = ArgumentDefaultValue :: None ;
7986 let mut directives = Vec :: new ( ) ;
8087 if let Some ( pair) = childs. next ( ) {
8188 if let Rule :: value_data = pair. as_rule ( ) {
82- default = Some ( parse_value_data ( pair, file) ?)
89+ default = ArgumentDefaultValue :: ValueData ( parse_value_data ( pair, file) ?)
90+ } else if let Rule :: identifier = pair. as_rule ( ) {
91+ default = ArgumentDefaultValue :: Identifier ( parse_identifier ( pair, file) ?)
8392 }
8493 for directive in childs {
8594 directives. push ( parse_directive ( directive, file) ?) ;
@@ -154,9 +163,19 @@ mod tests {
154163 fn test_default_value_for_argument_works ( ) {
155164 assert_eq ! (
156165 parse_input( "(arg: String = \" default\" )" ) ,
157- Ok ( vec![
158- Argument :: string( "arg" ) . default ( ValueData :: string( "default" ) )
159- ] )
166+ Ok ( vec![ Argument :: string( "arg" ) . default (
167+ ArgumentDefaultValue :: ValueData ( ValueData :: string( "default" ) )
168+ ) ] )
169+ ) ;
170+ }
171+
172+ #[ test]
173+ fn test_default_value_as_identifier_for_argument_works ( ) {
174+ assert_eq ! (
175+ parse_input( "(arg: String = Foo)" ) ,
176+ Ok ( vec![ Argument :: string( "arg" ) . default (
177+ ArgumentDefaultValue :: Identifier ( Identifier :: from( "Foo" ) )
178+ ) ] )
160179 ) ;
161180 }
162181
@@ -165,7 +184,9 @@ mod tests {
165184 assert_eq ! (
166185 parse_input( "(arg: String = \" default\" @dir1 @dir2)" ) ,
167186 Ok ( vec![ Argument :: string( "arg" )
168- . default ( ValueData :: string( "default" ) )
187+ . default ( ArgumentDefaultValue :: ValueData ( ValueData :: string(
188+ "default"
189+ ) ) )
169190 . directive( Directive :: build( "dir1" ) )
170191 . directive( Directive :: build( "dir2" ) ) ] )
171192 ) ;
0 commit comments