Replace travis with github actions
This commit is contained in:
parent
4cc5100c1b
commit
b3dbc36b76
@ -6,7 +6,7 @@ end_of_line = lf
|
|||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.{kt,kts,gradle}]
|
[*.{kt, kts, gradle}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
continuation_indent_size = 4
|
continuation_indent_size = 4
|
||||||
|
30
.github/workflows/ci.yaml
vendored
Normal file
30
.github/workflows/ci.yaml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
name: ci
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('gradle/wrapper/gradle-wrapper.*') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-wrapper-
|
||||||
|
|
||||||
|
- uses: actions/cache@v1
|
||||||
|
with:
|
||||||
|
path: ~/.gradle/caches
|
||||||
|
key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle.kts') }} }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-caches-
|
||||||
|
|
||||||
|
- uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
|
||||||
|
- run: ./gradlew check
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -7,6 +7,9 @@
|
|||||||
# Git
|
# Git
|
||||||
!.git*
|
!.git*
|
||||||
|
|
||||||
|
# GitHub
|
||||||
|
!.github
|
||||||
|
|
||||||
# EditorConfig
|
# EditorConfig
|
||||||
!.editorconfig
|
!.editorconfig
|
||||||
|
|
||||||
@ -16,9 +19,6 @@ out/
|
|||||||
*.ipr
|
*.ipr
|
||||||
*.iws
|
*.iws
|
||||||
|
|
||||||
# Travis CI
|
|
||||||
!.travis.yml
|
|
||||||
|
|
||||||
# Gradle
|
# Gradle
|
||||||
build/
|
build/
|
||||||
|
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
language: java
|
|
||||||
jdk:
|
|
||||||
- openjdk8
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
30
README.md
30
README.md
@ -1,6 +1,6 @@
|
|||||||
# kotlin-result
|
# kotlin-result
|
||||||
|
|
||||||
[![Release](https://api.bintray.com/packages/michaelbull/maven/kotlin-result/images/download.svg)](https://bintray.com/michaelbull/maven/kotlin-result/_latestVersion) [![Build Status](https://travis-ci.org/michaelbull/kotlin-result.svg?branch=master)](https://travis-ci.org/michaelbull/kotlin-result) [![License](https://img.shields.io/github/license/michaelbull/kotlin-result.svg)](https://github.com/michaelbull/kotlin-result/blob/master/LICENSE)
|
[![Release](https://api.bintray.com/packages/michaelbull/maven/kotlin-result/images/download.svg)](https://bintray.com/michaelbull/maven/kotlin-result/_latestVersion) [![Build Status](https://github.com/michaelbull/kotlin-result/workflows/ci/badge.svg)](https://github.com/michaelbull/kotlin-result/actions?query=workflow%3Aci) [![License](https://img.shields.io/github/license/michaelbull/kotlin-result.svg)](https://github.com/michaelbull/kotlin-result/blob/master/LICENSE)
|
||||||
|
|
||||||
[`Result<V, E>`][result] is a monad for modelling success ([`Ok`][result-ok]) or
|
[`Result<V, E>`][result] is a monad for modelling success ([`Ok`][result-ok]) or
|
||||||
failure ([`Err`][result-err]) operations.
|
failure ([`Err`][result-err]) operations.
|
||||||
@ -19,14 +19,14 @@ dependencies {
|
|||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
The [`Result`][result] monad has two subtypes, [`Ok<V>`][result-ok]
|
The [`Result`][result] monad has two subtypes, [`Ok<V>`][result-ok]
|
||||||
representing success and containing a `value`, and [`Err<E>`][result-err],
|
representing success and containing a `value`, and [`Err<E>`][result-err],
|
||||||
representing failure and containing an `error`.
|
representing failure and containing an `error`.
|
||||||
|
|
||||||
Scott Wlaschin's article on [Railway Oriented Programming][swalschin-rop] is a great
|
Scott Wlaschin's article on [Railway Oriented Programming][swalschin-rop] is a great
|
||||||
introduction to the benefits of modelling operations using the `Result` type.
|
introduction to the benefits of modelling operations using the `Result` type.
|
||||||
|
|
||||||
Mappings are available on the [wiki][wiki] to assist those with experience
|
Mappings are available on the [wiki][wiki] to assist those with experience
|
||||||
using the `Result` type in other languages:
|
using the `Result` type in other languages:
|
||||||
|
|
||||||
- [Elm](https://github.com/michaelbull/kotlin-result/wiki/Elm)
|
- [Elm](https://github.com/michaelbull/kotlin-result/wiki/Elm)
|
||||||
@ -37,7 +37,7 @@ using the `Result` type in other languages:
|
|||||||
### Creating Results
|
### Creating Results
|
||||||
|
|
||||||
The idiomatic approach to modelling operations that may fail in Railway
|
The idiomatic approach to modelling operations that may fail in Railway
|
||||||
Oriented Programming is to avoid throwing an exception and instead make the
|
Oriented Programming is to avoid throwing an exception and instead make the
|
||||||
return type of your function a `Result`.
|
return type of your function a `Result`.
|
||||||
|
|
||||||
```kotlin
|
```kotlin
|
||||||
@ -51,17 +51,17 @@ fun checkPrivileges(user: User, command: Command): Result<Command, CommandError>
|
|||||||
```
|
```
|
||||||
|
|
||||||
To incorporate the `Result` type into an existing codebase that throws
|
To incorporate the `Result` type into an existing codebase that throws
|
||||||
exceptions, you can wrap functions that may `throw` with
|
exceptions, you can wrap functions that may `throw` with
|
||||||
[`runCatching`][result-runCatching]. This will execute the block of code and
|
[`runCatching`][result-runCatching]. This will execute the block of code and
|
||||||
`catch` any `Throwable`, returning a `Result<T, Throwable>`.
|
`catch` any `Throwable`, returning a `Result<T, Throwable>`.
|
||||||
|
|
||||||
```kotlin
|
```kotlin
|
||||||
val result: Result<Customer, Throwable> = runCatching {
|
val result: Result<Customer, Throwable> = runCatching {
|
||||||
customerDb.findById(id = 50) // could throw SQLException or similar
|
customerDb.findById(id = 50) // could throw SQLException or similar
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Nullable types, such as the `find` method in the example below, can be
|
Nullable types, such as the `find` method in the example below, can be
|
||||||
converted to a `Result` using the `toResultOr` extension function.
|
converted to a `Result` using the `toResultOr` extension function.
|
||||||
|
|
||||||
```kotlin
|
```kotlin
|
||||||
@ -74,11 +74,11 @@ val result: Result<Customer, String> = customers
|
|||||||
|
|
||||||
Both success and failure results can be transformed within a stage of the
|
Both success and failure results can be transformed within a stage of the
|
||||||
railway track. The example below demonstrates how to transform an internal
|
railway track. The example below demonstrates how to transform an internal
|
||||||
program error (`UnlockError`) into an exposed client error
|
program error (`UnlockError`) into an exposed client error
|
||||||
(`IncorrectPassword`).
|
(`IncorrectPassword`).
|
||||||
|
|
||||||
```kotlin
|
```kotlin
|
||||||
val result: Result<Treasure, UnlockResponse> =
|
val result: Result<Treasure, UnlockResponse> =
|
||||||
unlockVault("my-password") // returns Result<Treasure, UnlockError>
|
unlockVault("my-password") // returns Result<Treasure, UnlockError>
|
||||||
.mapError { IncorrectPassword } // transform UnlockError into IncorrectPassword
|
.mapError { IncorrectPassword } // transform UnlockError into IncorrectPassword
|
||||||
```
|
```
|
||||||
@ -86,7 +86,7 @@ val result: Result<Treasure, UnlockResponse> =
|
|||||||
### Chaining
|
### Chaining
|
||||||
|
|
||||||
Results can be chained to produce a "happy path" of execution. For example, the
|
Results can be chained to produce a "happy path" of execution. For example, the
|
||||||
happy path for a user entering commands into an administrative console would
|
happy path for a user entering commands into an administrative console would
|
||||||
consist of: the command being tokenized, the command being registered, the user
|
consist of: the command being tokenized, the command being registered, the user
|
||||||
having sufficient privileges, and the command executing the associated action.
|
having sufficient privileges, and the command executing the associated action.
|
||||||
The example below uses the `checkPrivileges` function we defined earlier.
|
The example below uses the `checkPrivileges` function we defined earlier.
|
||||||
@ -143,9 +143,9 @@ in a real world scenario.
|
|||||||
|
|
||||||
It hosts a [ktor][ktor] server on port 9000 with a `/customers` endpoint. The
|
It hosts a [ktor][ktor] server on port 9000 with a `/customers` endpoint. The
|
||||||
endpoint responds to both `GET` and `POST` requests with a provided `id`, e.g.
|
endpoint responds to both `GET` and `POST` requests with a provided `id`, e.g.
|
||||||
`/customers/100`. Upserting a customer id of 42 is hardcoded to throw an
|
`/customers/100`. Upserting a customer id of 42 is hardcoded to throw an
|
||||||
[`SQLException`][customer-42] to demonstrate how the `Result` type can [map
|
[`SQLException`][customer-42] to demonstrate how the `Result` type can [map
|
||||||
internal program errors][update-customer-error] to more appropriate
|
internal program errors][update-customer-error] to more appropriate
|
||||||
user-facing errors.
|
user-facing errors.
|
||||||
|
|
||||||
### Payloads
|
### Payloads
|
||||||
|
Loading…
Reference in New Issue
Block a user