88import graphql .validation .constraints .Documentation ;
99import graphql .validation .rules .ValidationEnvironment ;
1010
11+ import java .util .Arrays ;
1112import java .util .HashMap ;
1213import java .util .List ;
1314import java .util .Map ;
1415import java .util .regex .Matcher ;
1516import java .util .regex .Pattern ;
1617
18+ import static graphql .schema .GraphQLTypeUtil .isList ;
1719import static java .util .Collections .emptyList ;
1820
1921public class PatternConstraint extends AbstractDirectiveConstraint {
@@ -31,9 +33,9 @@ public Documentation getDocumentation() {
3133
3234 .description ("The String must match the specified regular expression, which follows the Java regular expression conventions." )
3335
34- .example ("updateDriver( licencePlate : String @Patttern(regex : \" [A-Z][A-Z][A-Z]-[0-9][0-9][0-9]\" ) : DriverDetails" )
36+ .example ("updateDriver( licencePlate : String @Pattern(regexp : \" [A-Z][A-Z][A-Z]-[0-9][0-9][0-9]\" ) : DriverDetails" )
3537
36- .applicableTypeNames (Scalars .GraphQLString .getName ())
38+ .applicableTypeNames (Scalars .GraphQLString .getName (), "Lists" )
3739
3840 .directiveSDL ("directive @Pattern(regexp : String! =\" .*\" , message : String = \" %s\" ) " +
3941 "on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION" ,
@@ -44,28 +46,39 @@ public Documentation getDocumentation() {
4446 @ Override
4547 public boolean appliesToType (GraphQLInputType inputType ) {
4648 return isOneOfTheseTypes (inputType ,
47- Scalars .GraphQLString
48- );
49+ Scalars .GraphQLString ) || isList (inputType );
4950 }
5051
5152 @ Override
5253 protected List <GraphQLError > runConstraint (ValidationEnvironment validationEnvironment ) {
5354 Object validatedValue = validationEnvironment .getValidatedValue ();
55+ GraphQLInputType argumentType = validationEnvironment .getValidatedType ();
56+
5457 if (validatedValue == null ) {
5558 return emptyList ();
5659 }
57- String strValue = String .valueOf (validatedValue );
5860
59- GraphQLDirective directive = validationEnvironment .getContextObject (GraphQLDirective .class );
61+ List <Object > validatedValues ;
62+
63+ if (isList (argumentType )) {
64+ validatedValues = (List )validatedValue ;
65+ } else {
66+ validatedValues = Arrays .asList (validatedValue );
67+ }
68+
69+ for (Object value : validatedValues ) {
70+ String strValue = String .valueOf (value );
71+
72+ GraphQLDirective directive = validationEnvironment .getContextObject (GraphQLDirective .class );
6073
61- String patternArg = getStrArg (directive , "regexp" );
62- Pattern pattern = cachedPattern (patternArg );
74+ String patternArg = getStrArg (directive , "regexp" );
75+ Pattern pattern = cachedPattern (patternArg );
6376
64- Matcher matcher = pattern .matcher (strValue );
65- if (!matcher .matches ()) {
66- return mkError (validationEnvironment , directive , mkMessageParams ( validatedValue , validationEnvironment ,
67- "regexp" , patternArg
68- ));
77+ Matcher matcher = pattern .matcher (strValue );
78+ if (!matcher .matches ()) {
79+ return mkError (validationEnvironment , directive ,
80+ mkMessageParams ( validatedValue , validationEnvironment , "regexp" , patternArg ));
81+ }
6982 }
7083 return emptyList ();
7184 }
0 commit comments