apollographql / apollo-kotlin

:rocket:  A strongly-typed, caching GraphQL client for the JVM, Android, and Kotlin multiplatform.
https://www.apollographql.com/docs/kotlin
MIT License
3.76k stars 654 forks source link

Generate a Kotlin enum without the `UNKNOWN__` case #6243

Open joshuakcockrell opened 2 weeks ago

joshuakcockrell commented 2 weeks ago

Use case

Currently, when statements need to match .UNKNOWN__ every time they're used in a codebase.

when(color) {
  BLUEBERRY -> TODO()
  CANDY -> TODO()
  __UNKNOWN -> TODO()
} 

This means I need to think through the UNKNOWN fallback several times.

If the Apollo codegen provided an enum that didn't contain this case, I could instead write

when(color.unwrap()) {
  BLUEBERRY -> TODO()
  CANDY -> TODO()
} 

Yes, nothing's currently stopping me from writing an unwrap() extension, but I still need to sprinkle __UNKNOWN throughout my codebase to get the when statements to compile.

This is how Apollo iOS works, btw. GraphQLEnum.unknown is instead a wrapper enum around the core enum. On first glance, you would think Kotlin's approach is nicer because you don't need to match .case(...), but every single when statement needs a default case to handle the .UNKNOWN__, whereas iOS I can just create an unwrapper at the top level of my project to handle .unknown once.

Screenshot 2024-11-06 at 2 51 19 PM

Describe the solution you'd like

Screenshot_2024-11-06_at_2 29 15_PM

Apollo Kotlin already generates knownEntries List. If it just provided this exact thing in enum format I could write my own project level unwrap() and my individual when statements would never need to worry about .UNKNOWN__.

More context

Discord thread

joshuakcockrell commented 2 weeks ago

For the record, after using both iOS & Kotlin Apollo libraries, I do like Apollo Kotlin's enum approach better as a starting point. Seeing Getting Started examples that have .case(..) is kinda gross on iOS. But I'd say Apollo iOS wins for the power use cases once you figure out how to write your own .unwrap() extensions.

Ideally, Apollo Kotlin could just codegen a knownEntries enum and that's the best of both worlds.

martinbonnin commented 2 weeks ago

@joshuakcockrell an implementation is available at https://github.com/apollographql/apollo-kotlin/pull/6248. Let us know what you think

github-actions[bot] commented 1 week ago

Do you have any feedback for the maintainers? Please tell us by taking a one-minute survey. Your responses will help us understand Apollo Kotlin usage and allow us to serve you better.

joshuakcockrell commented 1 week ago

Wow, that's a crazy fast turnaround on this! I'm excited to test this out. Will let you know how it goes.

martinbonnin commented 1 week ago

Damn, I didn't mean to close this issue so fast, forgot that merging the PR would close the issue 🤦 In all cases, let us know how it goes, it's available in the SNAPSHOTs now.

martinbonnin commented 1 week ago

@joshuakcockrell did you get a chance to test this? Just want to make sure it's working for you while while it's still hot.

joshuakcockrell commented 1 week ago

@martinbonnin I've been having difficulty getting the snapshot working. I got 4.1.1-SNAPSHOT working but couldn't see any difference in the generated code. I'll try again today.