Невозможно построить запрос из сгенерированного класса Apollo в Kotlin (.builder () отсутствует) - PullRequest
0 голосов
/ 23 марта 2020

Я не могу построить запрос, сгенерированный Android библиотекой Apollo.

У меня есть следующий файл .gpaphql:

mutation LogIn($username: String!, $password: String!) {
  tokenAuth(username: $username, password: $password) {
    token
  }
}

Для этого сгенерирован Kotlin файл запроса:

// AUTO-GENERATED FILE. DO NOT MODIFY.
//
// This class was automatically generated by Apollo GraphQL plugin from the GraphQL queries it found.
// It should not be modified by hand.
//
import com.apollographql.apollo.api.InputFieldMarshaller
import com.apollographql.apollo.api.Mutation
import com.apollographql.apollo.api.Operation
import com.apollographql.apollo.api.OperationName
import com.apollographql.apollo.api.Response
import com.apollographql.apollo.api.ResponseField
import com.apollographql.apollo.api.ResponseFieldMapper
import com.apollographql.apollo.api.ResponseFieldMarshaller
import com.apollographql.apollo.api.ResponseReader
import com.apollographql.apollo.api.internal.SimpleOperationResponseParser
import com.apollographql.apollo.internal.QueryDocumentMinifier
import com.apollographql.apollo.response.ScalarTypeAdapters
import com.apollographql.apollo.response.ScalarTypeAdapters.DEFAULT
import java.io.IOException
import kotlin.Any
import kotlin.Array
import kotlin.String
import kotlin.Suppress
import kotlin.collections.Map
import kotlin.jvm.Throws
import kotlin.jvm.Transient
import okio.BufferedSource

@Suppress("NAME_SHADOWING", "UNUSED_ANONYMOUS_PARAMETER", "LocalVariableName",
    "RemoveExplicitTypeArguments", "NestedLambdaShadowedImplicitParameter")
data class LogInMutation(
  val username: String,
  val password: String
) : Mutation<LogInMutation.Data, LogInMutation.Data, Operation.Variables> {
  @Transient
  private val variables: Operation.Variables = object : Operation.Variables() {
    override fun valueMap(): Map<String, Any?> = mutableMapOf<String, Any?>().apply {
      this["username"] = this@LogInMutation.username
      this["password"] = this@LogInMutation.password
    }

    override fun marshaller(): InputFieldMarshaller = InputFieldMarshaller { writer ->
      writer.writeString("username", this@LogInMutation.username)
      writer.writeString("password", this@LogInMutation.password)
    }
  }

  override fun operationId(): String = OPERATION_ID
  override fun queryDocument(): String = QUERY_DOCUMENT
  override fun wrapData(data: Data?): Data? = data
  override fun variables(): Operation.Variables = variables
  override fun name(): OperationName = OPERATION_NAME
  override fun responseFieldMapper(): ResponseFieldMapper<Data> = ResponseFieldMapper {
    Data(it)
  }

  @Throws(IOException::class)
  override fun parse(source: BufferedSource, scalarTypeAdapters: ScalarTypeAdapters): Response<Data>
      = SimpleOperationResponseParser.parse(source, this, scalarTypeAdapters)

  @Throws(IOException::class)
  override fun parse(source: BufferedSource): Response<Data> = parse(source, DEFAULT)

  data class TokenAuth(
    val __typename: String = "ObtainJSONWebToken",
    val token: String?
  ) {
    fun marshaller(): ResponseFieldMarshaller = ResponseFieldMarshaller { writer ->
      writer.writeString(RESPONSE_FIELDS[0], this@TokenAuth.__typename)
      writer.writeString(RESPONSE_FIELDS[1], this@TokenAuth.token)
    }

    companion object {
      private val RESPONSE_FIELDS: Array<ResponseField> = arrayOf(
          ResponseField.forString("__typename", "__typename", null, false, null),
          ResponseField.forString("token", "token", null, true, null)
          )

      operator fun invoke(reader: ResponseReader): TokenAuth = reader.run {
        val __typename = readString(RESPONSE_FIELDS[0])
        val token = readString(RESPONSE_FIELDS[1])
        TokenAuth(
          __typename = __typename,
          token = token
        )
      }
    }
  }

  data class Data(
    /**
     * Obtain JSON Web Token mutation
     */
    val tokenAuth: TokenAuth?
  ) : Operation.Data {
    override fun marshaller(): ResponseFieldMarshaller = ResponseFieldMarshaller { writer ->
      writer.writeObject(RESPONSE_FIELDS[0], this@Data.tokenAuth?.marshaller())
    }

    companion object {
      private val RESPONSE_FIELDS: Array<ResponseField> = arrayOf(
          ResponseField.forObject("tokenAuth", "tokenAuth", mapOf<String, Any>(
            "username" to mapOf<String, Any>(
              "kind" to "Variable",
              "variableName" to "username"),
            "password" to mapOf<String, Any>(
              "kind" to "Variable",
              "variableName" to "password")), true, null)
          )

      operator fun invoke(reader: ResponseReader): Data = reader.run {
        val tokenAuth = readObject<TokenAuth>(RESPONSE_FIELDS[0]) { reader ->
          TokenAuth(reader)
        }
        Data(
          tokenAuth = tokenAuth
        )
      }
    }
  }

  companion object {
    const val OPERATION_ID: String =
        "acc7a24c081a8c5ab67096b47de8c07e405411185c4016e47a75c0fdffe726e9"

    val QUERY_DOCUMENT: String = QueryDocumentMinifier.minify(
          """
          |mutation LogIn(${'$'}username: String!, ${'$'}password: String!) {
          |  tokenAuth(username: ${'$'}username, password: ${'$'}password) {
          |    __typename
          |    token
          |  }
          |}
          """.trimMargin()
        )

    val OPERATION_NAME: OperationName = OperationName { "LogIn" }
  }
}

Сгенерированный класс LogInMutation не имеет. Метод builder (), это класс данных. Как создать экземпляр класса Query из этого запроса, чтобы иметь возможность использовать его в качестве параметра в методе ApolloClient.query ()?

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете напрямую использовать конструктор сгенерированной модели следующим образом:

ApolloClient.query(LogInMutation("name", "pass"))
...