package io.vertx.ext.web.handler.graphql;

import graphql.schema.*;
import io.vertx.codegen.annotations.GenIgnore;
import io.vertx.codegen.annotations.VertxGen;
import io.vertx.ext.web.FileUpload;

import static io.vertx.codegen.annotations.GenIgnore.PERMITTED_TYPE;

@VertxGen
public interface UploadScalar {

  @GenIgnore(PERMITTED_TYPE)
  static GraphQLScalarType build() {
    return new GraphQLScalarType.Builder()
      .name("Upload").description("A file part in a multipart request").coercing(new Coercing() {

        @Override
        public Object serialize(Object o) throws CoercingSerializeException {
          throw new CoercingSerializeException("Upload is an input-only type");
        }

        @Override
        public Object parseValue(Object o) throws CoercingParseValueException {
          if (o == null || o instanceof FileUpload) {
            return o;
          }

          throw new CoercingParseValueException("Expected type FileUpload");
        }

        @Override
        public Object parseLiteral(Object o) throws CoercingParseLiteralException {
          throw new CoercingParseLiteralException("Must use variables to specify Upload values");
        }
      }).build();
  }
}