将 graphql 枚举映射到 kotlin 枚举

Posted

技术标签:

【中文标题】将 graphql 枚举映射到 kotlin 枚举【英文标题】:mapping a graphql enum to a kotlin enum 【发布时间】:2019-08-14 14:55:16 【问题描述】:

我对 Graphql 和 Kotlin 都很陌生,我遇到了一个问题。我有一个名为成分的对象(kotlin 中的数据类,输入 graphql)。成分有一个名称和一个 ID,两个字符串,一个 vegan 和 glutenfree 值,两个枚举。

我遇到的问题是,当我尝试创建具有突变的成分时,我得到 Vegan 和 GlutenFree 的类型不匹配,它需要“type.Vegan”并找到“me.paxana.myapplication.models .Vegan”

这是我用来创建成分的函数。由于上面提到的类型不匹配,其中的成分.vegan 和成分.gf 带有下划线。

fun createIngredient(ingredient: Ingredient ) 
    val createIngredientInput = CreateIngredientInput.builder().name(ingredient.name).vegan(ingredient.vegan).gf(ingredient.gf).build()
    mAWSAppSyncClient!!.mutate(CreateIngredientMutation.builder().input(createIngredientInput).build())
        .enqueue(mutationCallback)

这是成分数据类:

data class Ingredient(val id: String, val name: String, val vegan: Vegan = Vegan.UNKNOWN, val gf: GlutenFree = GlutenFree.UNKNOWN ) 

这是我的 Vegan 枚举类

enum class Vegan 
    VEGAN, NONVEGAN, UNKNOWN

这是我的 graphQL 架构

input CreateIngredientInput 
    name: String!
    vegan: Vegan
    gf: GlutenFree


input DeleteIngredientInput 
    id: ID!


enum GlutenFree 
    GLUTENFREE
    CONTAINSGLUTEN
    UNKNOWN


type Ingredient 
    id: ID!
    name: String!
    vegan: Vegan
    gf: GlutenFree


type IngredientConnection 
    items: [Ingredient]
    nextToken: String


input ModelBooleanFilterInput 
    ne: Boolean
    eq: Boolean


input ModelFloatFilterInput 
    ne: Float
    eq: Float
    le: Float
    lt: Float
    ge: Float
    gt: Float
    contains: Float
    notContains: Float
    between: [Float]


input ModelIDFilterInput 
    ne: ID
    eq: ID
    le: ID
    lt: ID
    ge: ID
    gt: ID
    contains: ID
    notContains: ID
    between: [ID]
    beginsWith: ID


input ModelIntFilterInput 
    ne: Int
    eq: Int
    le: Int
    lt: Int
    ge: Int
    gt: Int
    contains: Int
    notContains: Int
    between: [Int]


enum ModelSortDirection 
    ASC
    DESC


input ModelStringFilterInput 
    ne: String
    eq: String
    le: String
    lt: String
    ge: String
    gt: String
    contains: String
    notContains: String
    between: [String]
    beginsWith: String


type Mutation 
    createIngredient(input: CreateIngredientInput!): Ingredient
    updateIngredient(input: UpdateIngredientInput!): Ingredient
    deleteIngredient(input: DeleteIngredientInput!): Ingredient


type Query 
    getIngredient(id: ID!): Ingredient
    listIngredients(filter: TableIngredientFilterInput, limit: Int, nextToken: String): IngredientConnection


type Subscription 
    onCreateIngredient(
        id: ID,
        name: String,
        vegan: Vegan,
        gf: GlutenFree
    ): Ingredient
        @aws_subscribe(mutations: ["createIngredient"])
    onUpdateIngredient(
        id: ID,
        name: String,
        vegan: Vegan,
        gf: GlutenFree
    ): Ingredient
        @aws_subscribe(mutations: ["updateIngredient"])
    onDeleteIngredient(
        id: ID,
        name: String,
        vegan: Vegan,
        gf: GlutenFree
    ): Ingredient
        @aws_subscribe(mutations: ["deleteIngredient"])


input TableBooleanFilterInput 
    ne: Boolean
    eq: Boolean


input TableFloatFilterInput 
    ne: Float
    eq: Float
    le: Float
    lt: Float
    ge: Float
    gt: Float
    contains: Float
    notContains: Float
    between: [Float]


input TableIDFilterInput 
    ne: ID
    eq: ID
    le: ID
    lt: ID
    ge: ID
    gt: ID
    contains: ID
    notContains: ID
    between: [ID]
    beginsWith: ID


input TableIngredientFilterInput 
    id: TableIDFilterInput
    name: TableStringFilterInput
    vegan: TableBooleanFilterInput
    gf: TableBooleanFilterInput


input TableIntFilterInput 
    ne: Int
    eq: Int
    le: Int
    lt: Int
    ge: Int
    gt: Int
    contains: Int
    notContains: Int
    between: [Int]


input TableStringFilterInput 
    ne: String
    eq: String
    le: String
    lt: String
    ge: String
    gt: String
    contains: String
    notContains: String
    between: [String]
    beginsWith: String


input UpdateIngredientInput 
    id: ID!
    name: String
    vegan: Vegan
    gf: GlutenFree


enum Vegan 
    VEGAN
    NONVEGAN
    UNKNOWN

【问题讨论】:

【参考方案1】:

好的,所以在我的项目上运行 amplify codegen 之后,我有了一个可以使用的 type.Vegan 和 type.GlutenFree 枚举,所以我摆脱了本地的 kotlin 枚举并创建了成分对象 type.Vegan 的属性并输入.GlutenFree。

像魅力一样工作。

【讨论】:

以上是关于将 graphql 枚举映射到 kotlin 枚举的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxJava 生成一个映射,其中键是 Kotlin 枚举的值,映射的值来自另一个 RxJava 流

GraphQL 是不是将 Int 作为枚举

如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]

将枚举类型作为参数传递给 GraphQL 查询 - Quarkus

GraphQL - 将枚举值作为参数直接传递给突变?

将枚举值映射到类型