diff --git a/graphqxl_parser/src/ast_arguments.rs b/graphqxl_parser/src/ast_arguments.rs index 5ac5305..06b5667 100644 --- a/graphqxl_parser/src/ast_arguments.rs +++ b/graphqxl_parser/src/ast_arguments.rs @@ -6,13 +6,20 @@ use crate::utils::{unknown_rule_error, OwnedSpan}; use crate::{parse_directive, parse_value_type, Directive, ValueType}; use pest::iterators::Pair; +#[derive(Debug, Clone, PartialEq)] +pub enum ArgumentDefaultValue { + None, + ValueData(ValueData), + Identifier(Identifier), +} + #[derive(Debug, Clone, PartialEq)] pub struct Argument { pub span: OwnedSpan, pub name: Identifier, pub description: String, pub value_type: ValueType, - pub default: Option, + pub default: ArgumentDefaultValue, pub directives: Vec, } @@ -23,7 +30,7 @@ impl Argument { name: Identifier::from(name), description: "".to_string(), value_type: t, - default: None, + default: ArgumentDefaultValue::None, directives: Vec::new(), } } @@ -53,8 +60,8 @@ impl Argument { self.clone() } - pub fn default(&mut self, value_data: ValueData) -> Self { - self.default = Some(value_data); + pub fn default(&mut self, default: ArgumentDefaultValue) -> Self { + self.default = default; self.clone() } @@ -75,11 +82,13 @@ fn parse_argument(pair: Pair, file: &str) -> Result Result> { parse_full_input(input, Rule::field_with_args, parse_block_field) @@ -198,8 +199,9 @@ mod tests { Ok(BlockField::build("field") .string() .arg( - Argument::build("arg1", ValueType::string().array().non_nullable()) - .default(ValueData::string("default").list()) + Argument::build("arg1", ValueType::string().array().non_nullable()).default( + ArgumentDefaultValue::ValueData(ValueData::string("default").list()) + ) ) .arg(Argument::build("arg2", ValueType::float().non_nullable()))) ); diff --git a/graphqxl_parser/src/grammar.pest b/graphqxl_parser/src/grammar.pest index 54d66da..8a624e5 100644 --- a/graphqxl_parser/src/grammar.pest +++ b/graphqxl_parser/src/grammar.pest @@ -77,7 +77,7 @@ field_without_args = { description? ~ identifier ~ ":" ~ value_type ~ directive* field_without_args_without_value = { description? ~ identifier ~ directive* } arguments = { "(" ~ argument* ~ ")" } - argument = { description? ~ identifier ~ ":" ~ value_type ~ ("=" ~ value_data)? ~ directive* } + argument = { description? ~ identifier ~ ":" ~ value_type ~ ("=" ~ (value_data | identifier))? ~ directive* } function_call = { "(" ~ function_input+ ~ ")" } function_input = { identifier ~ ":" ~ value_data } diff --git a/graphqxl_synthesizer/src/synth_arguments.rs b/graphqxl_synthesizer/src/synth_arguments.rs index e988958..ef355d7 100644 --- a/graphqxl_synthesizer/src/synth_arguments.rs +++ b/graphqxl_synthesizer/src/synth_arguments.rs @@ -1,10 +1,11 @@ use crate::synth_directive::DirectiveSynth; +use crate::synth_identifier::IdentifierSynth; use crate::synth_value_data::ValueDataSynth; use crate::synth_value_type::ValueTypeSynth; use crate::synths::{ ChainSynth, MultilineListSynth, OneLineListSynth, StringSynth, Synth, SynthContext, }; -use graphqxl_parser::Argument; +use graphqxl_parser::{Argument, ArgumentDefaultValue}; pub(crate) struct ArgumentsSynth(pub(crate) Vec); @@ -18,10 +19,14 @@ impl Synth for ArgumentsSynth { Box::new(StringSynth(argument.name.id.clone() + ": ")), Box::new(ValueTypeSynth(argument.value_type.clone())), ]; - if let Some(default) = &argument.default { + if let ArgumentDefaultValue::ValueData(default) = &argument.default { v.push(Box::new(StringSynth::from(" = "))); v.push(Box::new(ValueDataSynth(default.clone()))); + } else if let ArgumentDefaultValue::Identifier(default) = &argument.default { + v.push(Box::new(StringSynth::from(" = "))); + v.push(Box::new(IdentifierSynth(default.clone()))); } + for directive in argument.directives.iter() { v.push(Box::new(StringSynth::from(" "))); v.push(Box::new(DirectiveSynth(directive.clone()))); @@ -68,7 +73,9 @@ mod tests { #[test] fn test_with_default_value() { - let synth = ArgumentsSynth(vec![Argument::int("arg").default(ValueData::int(1).list())]); + let synth = + ArgumentsSynth(vec![Argument::int("arg") + .default(ArgumentDefaultValue::ValueData(ValueData::int(1).list()))]); assert_eq!(synth.synth_zero(), "(arg: Int = [ 1 ])") } @@ -81,7 +88,7 @@ mod tests { #[test] fn test_with_default_value_with_directives() { let synth = ArgumentsSynth(vec![Argument::int("arg") - .default(ValueData::int(1).list()) + .default(ArgumentDefaultValue::ValueData(ValueData::int(1).list())) .directive(Directive::build("dir"))]); assert_eq!(synth.synth_zero(), "(arg: Int = [ 1 ] @dir)") } diff --git a/src/test/default-arg.graphqxl b/src/test/default-arg.graphqxl new file mode 100644 index 0000000..edb3e64 --- /dev/null +++ b/src/test/default-arg.graphqxl @@ -0,0 +1,8 @@ +enum Enum { + One + Other +} + +type Query { + foo(bar: Enum! = One): Boolean +} diff --git a/src/test/default-arg.graphqxl.result b/src/test/default-arg.graphqxl.result new file mode 100644 index 0000000..dbe6883 --- /dev/null +++ b/src/test/default-arg.graphqxl.result @@ -0,0 +1,9 @@ +enum Enum { + One + Other +} + +type Query { + foo(bar: Enum! = One): Boolean +} +