All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.apollographql.execution.processor.schema.kt Maven / Gradle / Ivy

package com.apollographql.execution.processor

import com.apollographql.apollo.ast.GQLArgument
import com.apollographql.apollo.ast.GQLDirective
import com.apollographql.apollo.ast.GQLDocument
import com.apollographql.apollo.ast.GQLEnumTypeDefinition
import com.apollographql.apollo.ast.GQLEnumValueDefinition
import com.apollographql.apollo.ast.GQLFieldDefinition
import com.apollographql.apollo.ast.GQLInputObjectTypeDefinition
import com.apollographql.apollo.ast.GQLInputValueDefinition
import com.apollographql.apollo.ast.GQLInterfaceTypeDefinition
import com.apollographql.apollo.ast.GQLListType
import com.apollographql.apollo.ast.GQLNamedType
import com.apollographql.apollo.ast.GQLNonNullType
import com.apollographql.apollo.ast.GQLObjectTypeDefinition
import com.apollographql.apollo.ast.GQLOperationTypeDefinition
import com.apollographql.apollo.ast.GQLScalarTypeDefinition
import com.apollographql.apollo.ast.GQLSchemaDefinition
import com.apollographql.apollo.ast.GQLStringValue
import com.apollographql.apollo.ast.GQLType
import com.apollographql.apollo.ast.GQLTypeDefinition
import com.apollographql.apollo.ast.GQLUnionTypeDefinition
import com.apollographql.apollo.ast.GQLValue
import com.apollographql.apollo.ast.parseAsGQLValue
import com.apollographql.apollo.ast.toSDL
import com.apollographql.execution.processor.sir.SirEnumDefinition
import com.apollographql.execution.processor.sir.SirEnumValueDefinition
import com.apollographql.execution.processor.sir.SirErrorType
import com.apollographql.execution.processor.sir.SirFieldDefinition
import com.apollographql.execution.processor.sir.SirGraphQLArgumentDefinition
import com.apollographql.execution.processor.sir.SirInputFieldDefinition
import com.apollographql.execution.processor.sir.SirInputObjectDefinition
import com.apollographql.execution.processor.sir.SirInterfaceDefinition
import com.apollographql.execution.processor.sir.SirListType
import com.apollographql.execution.processor.sir.SirNamedType
import com.apollographql.execution.processor.sir.SirNonNullType
import com.apollographql.execution.processor.sir.SirObjectDefinition
import com.apollographql.execution.processor.sir.SirScalarDefinition
import com.apollographql.execution.processor.sir.SirType
import com.apollographql.execution.processor.sir.SirTypeDefinition
import com.apollographql.execution.processor.sir.SirUnionDefinition
import okio.Buffer

internal fun schemaString(typeDefinitions: List): String {
  val schemaDefinition = GQLSchemaDefinition(
      sourceLocation = null,
      description = null,
      directives = emptyList(),
      rootOperationTypeDefinitions = listOf("query", "mutation", "subscription").mapNotNull { operationType ->
        typeDefinitions.filterIsInstance()
            .firstOrNull {
              it.operationType == operationType
            }?.name
            ?.let {
              GQLOperationTypeDefinition(
                  null,
                  operationType,
                  it
              )
            }
      }
  )

  return GQLDocument(
      definitions = listOf(schemaDefinition) + typeDefinitions.map { it.toGQL() },
      sourceLocation = null
  ).toSDL("  ")
}

private fun SirTypeDefinition.toGQL(): GQLTypeDefinition {
  return when (this) {
    is SirEnumDefinition -> GQLEnumTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        directives = emptyList(),
        enumValues = this.values.map {
          it.toGQL()
        }
    )

    is SirInputObjectDefinition -> GQLInputObjectTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        directives = emptyList(),
        inputFields = this.inputFields.map {
          it.toGQL()
        }
    )
    is SirInterfaceDefinition -> GQLInterfaceTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        directives = emptyList(),
        implementsInterfaces = interfaces,
        fields = this.fields.map {
          it.toGQL()
        }
    )
    is SirObjectDefinition -> GQLObjectTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        implementsInterfaces = interfaces,
        directives = emptyList(),
        fields = this.fields.map {
          it.toGQL()
        }
    )
    is SirScalarDefinition -> GQLScalarTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        directives = emptyList()
    )
    is SirUnionDefinition -> GQLUnionTypeDefinition(
        sourceLocation = null,
        description = description,
        name = name,
        directives = emptyList(),
        memberTypes = memberTypes.map { GQLNamedType(null, it) }
    )
  }
}

private fun SirFieldDefinition.toGQL(): GQLFieldDefinition {
  return GQLFieldDefinition(
      sourceLocation = null,
      description = description,
      directives = deprecationReason.toGQLDirectives(),
      name = name,
      arguments = arguments.filterIsInstance().map { it.toGQL() },
      type = type.toGQL()
  )
}

private fun SirGraphQLArgumentDefinition.toGQL(): GQLInputValueDefinition {
  return GQLInputValueDefinition(
      sourceLocation = null,
      description = description,
      directives = deprecationReason.toGQLDirectives(),
      name = name,
      type = type.toGQL(),
      defaultValue = defaultValue.toGQLDefaultValue()
  )
}

private fun SirInputFieldDefinition.toGQL(): GQLInputValueDefinition {
  return GQLInputValueDefinition(
      sourceLocation = null,
      description = description,
      name = name,
      directives = deprecationReason.toGQLDirectives(),
      type = type.toGQL(),
      defaultValue = defaultValue.toGQLDefaultValue()
  )
}

private fun String?.toGQLDefaultValue(): GQLValue? {
  if (this == null) {
    return null
  }
  return Buffer().writeUtf8(this).parseAsGQLValue().value
}


private fun SirType.toGQL(): GQLType {
  return when(this) {
    SirErrorType -> GQLNamedType(null, "APOLLO_ERROR")
    is SirListType -> GQLListType(null, type.toGQL())
    is SirNamedType -> GQLNamedType(null, name = name)
    is SirNonNullType -> GQLNonNullType(null, type.toGQL())
  }
}


private fun SirEnumValueDefinition.toGQL(): GQLEnumValueDefinition {
  return GQLEnumValueDefinition(
      sourceLocation = null,
      description = description,
      directives = deprecationReason.toGQLDirectives(),
      name = name
  )
}

private fun String?.toGQLDirectives(): List {
  if (this == null) {
    return emptyList()
  }
  return listOf(
      GQLDirective(
          sourceLocation = null,
          name = "deprecated",
          arguments = listOf(
              GQLArgument(
                  sourceLocation = null,
                  name = "reason",
                  value = GQLStringValue(null, this)
              )
          )
      )
  )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy