Skip to content

IMPORTANT

GraQL is prerelease, experimental, and a demonstration piece. Use at your own risk.

Scalars

What Are Scalars?

Scalars are the lowest-level types in a GraphQL schema. You're probably familiar with a few: Boolean, String, Int, etc.

To build a robust API, you'll need to define more, such as Date or EmailAddress.

graphql-java provides great documentation and an interface for doing this.

GraQL builds on this by allowing you to annotate any implementation of the graphql-java graphql.schema.Coercing interface as a @GraQLScalar to automatically register it with the underlying GraphQL schema.

Example

For a given schema definition declaring a DateTime scalar and using it within a ToDoDTO input type:

graphql
scalar DateTime

input ToDoDTO {
    title: String!
    author: String!
    dueDate: DateTime!
}

GraQL includes a scalar for DateTime with a very straightforward implementation:

kotlin
@GraQLScalar
class DateTime: Coercing<LocalDateTime, String> {

    override fun serialize(input: Any): String {
        if (input is LocalDateTime) {
            return input.format(DateTimeFormatter.ISO_DATE_TIME)
        } else {
            throw CoercingSerializeException("Not a valid DateTime")
        }
    }

    override fun parseValue(input: Any): LocalDateTime {
        return LocalDateTime.parse(input.toString(), DateTimeFormatter.ISO_DATE_TIME)
    }

    override fun parseLiteral(input: Value<*>, variables: CoercedVariables, graphQLContext: GraphQLContext, locale: Locale): LocalDateTime? {
        if (input is StringValue) {
            return LocalDateTime.parse((input).getValue(), DateTimeFormatter.ISO_DATE_TIME)
        }

        throw CoercingParseLiteralException("Value is not a valid ISO date time")
    }

    override fun valueToLiteral(input: Any, graphQLContext: GraphQLContext, locale: Locale): Value<*> {
        return StringValue(this.serialize(input))
    }
    
}