Custom result type with typed errors #999
Merged
+134
−65
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Melko pitkälle viety Proof-of-Concept
Result
-tyypistä vahvasti tyypitetyillä virheillä.Toteutettuna
TypedResult<Value, Error>
-tyyppi ja sille joitain yleisimmin tarvittuja toimintoja. Toteutus muistuttaa rajapinnaltaan vahvasti standardikirjastonResult
-tyyppiä, sillä erotuksella, ettäSuccess
- jaFailure
-variaatiot on toteutettu aliluokkina ja itseTypedResult
onsealed class
. Tämä mahdollistaa mm. exhaustivewhen
-lauseetSuccess
jaFailure
-luokkia käyttäen. Tämän hyödyllisyys on tosin melko rajallista (ja/tai johtaa verboosiin koodiin), sillä Kotlin ei mahdollista mm. destrukturointiawhen
lauseiden osana, joskin utility-metodien ja itseTypedResult
-luokan toteutus oli tämän ansiosta melko helppoa.Olennaisimpina muutoksina:
as Error.Validation
-tyyliset tyyppimuunnokset putoavat pois.flatMap
-kikkailua vartenError
luokalle piti lisätäError.Oppija
-aliluokka, kaikkiatoOppija
/getOppijanumero
-putkesta syntyviä virheitä vartenJälkimmäinen muutos on lähinnä sen demonstrointia varten, että tällainen on ylipäätään mahdollista. Tämä on lähimmäs tyyppi-unioneja (esim.
OppijaValidationFailure | OppijanumeroException
) mitä Kotlinin rajoitteiden puitteissa sain aikaiseksi.