Skip to content

Commit

Permalink
Adding support for args of various Java types (not just proto Messages)
Browse files Browse the repository at this point in the history
  • Loading branch information
siderakis committed Mar 27, 2018
1 parent 763bde0 commit 8bd0097
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
Expand Up @@ -38,6 +38,7 @@
import graphql.schema.GraphQLList;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLOutputType;
import graphql.schema.GraphQLScalarType;

import javax.annotation.Nullable;
import javax.inject.Provider;
Expand Down Expand Up @@ -415,7 +416,7 @@ private GraphQLFieldDefinition methodToFieldDefinition(
}
}

ImmutableMap<java.lang.reflect.Type, GraphQLOutputType> javaTypeToScalarMap =
ImmutableMap<java.lang.reflect.Type, GraphQLScalarType> javaTypeToScalarMap =
ImmutableMap.of(
String.class, Scalars.GraphQLString,
Integer.class, Scalars.GraphQLInt,
Expand Down Expand Up @@ -504,6 +505,7 @@ private ImmutableList<MethodMetadata> getMethodMetadata(
} else {
GqlInputConverter inputConverter =
GqlInputConverter.newBuilder().add(requestDescriptor.getFile()).build();
addExtraType(requestDescriptor);
Message message =
((Message.Builder) requestClass.getMethod("newBuilder").invoke(null)).build();
String argName = getArgName(method.getParameterAnnotations()[i]);
Expand All @@ -517,6 +519,21 @@ private ImmutableList<MethodMetadata> getMethodMetadata(
GraphQLArgument argument = GqlInputConverter.createArgument(requestDescriptor, argName);
listBuilder.add(MethodMetadata.create(function, argument));
}
} else if (isArg(method.getParameterAnnotations()[i])) {
if (javaTypeToScalarMap.containsKey(parameterType)) {
String argName = getArgName(method.getParameterAnnotations()[i]);
Function<DataFetchingEnvironment, ?> function =
environment -> environment.getArgument(argName);
GraphQLArgument argument =
GraphQLArgument.newArgument()
.name(argName)
.type(javaTypeToScalarMap.get(parameterType))
.build();
listBuilder.add(MethodMetadata.create(function, argument));
} else {
throw new RuntimeException("Unknown arg type: " + parameterType.getName());
}

} else if (DataFetchingEnvironment.class.isAssignableFrom(parameterType)) {
listBuilder.add(MethodMetadata.create(Functions.identity()));
} else {
Expand All @@ -539,6 +556,15 @@ private ImmutableList<MethodMetadata> getMethodMetadata(
return listBuilder.build();
}

private static boolean isArg(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation.annotationType().isAssignableFrom(Arg.class)) {
return true;
}
}
return false;
}

private static String getArgName(Annotation[] annotations) {
for (Annotation annotation : annotations) {
if (annotation.annotationType().isAssignableFrom(Arg.class)) {
Expand Down
Expand Up @@ -34,8 +34,9 @@ Boolean isAfterNow(Timestamp timestamp) {
return Instant.ofEpochSecond(timestamp.getSeconds()).isAfter(Instant.now());
}

@SchemaModification(addField = "afterNow", onType = Timestamp.class)
@SchemaModification(addField = "localTime", onType = Timestamp.class)
String localTime(Timestamp timestamp, @Arg("timezone") String timezone) {
// TODO: Arg should be required, optional should be optional
return Instant.ofEpochSecond(timestamp.getSeconds()).atZone(ZoneId.of(timezone)).toString();
}
}

0 comments on commit 8bd0097

Please sign in to comment.