package com.creactiviti.spring.boot.starter.graphql;

import graphql.Scalars;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLFieldDefinition.Builder;
import graphql.schema.GraphQLNonNull;

/**
 * This class consists exclusively of static methods that operate on or return
 * GraphQL fields.
 * 
 * @author Arik Cohen
 * @since Feb 10, 2018
 */
public final class Fields {
  
  private Fields () {}

  public static Builder stringField (String aName) {
    return create(aName).type(Scalars.GraphQLString);
  }
  
  public static Builder spelField (String aName, String aExpression) {
    return create(aName).dataFetcher(new SpelDataFetcher(aExpression));
  }
  
  public static Builder notNull (Builder aSource) {
    GraphQLFieldDefinition field = aSource.build();
    return create(field.getName()).argument(field.getArguments())
                                  .type(new GraphQLNonNull(field.getType()))
                                  .dataFetcher(field.getDataFetcher())
                                  .definition(field.getDefinition())
                                  .deprecate(field.getDeprecationReason())
                                  .description(field.getDescription());
  }
  
  public static Builder field (String aName) {
    return create(aName);
  }
  
  private static Builder create (String aName) {
    return new Builder().name(aName);
  }
  
}