8000 exceptions-to-values.5 : Introduce Result · java-to-kotlin/code@496c4c6 · GitHub
[go: up one dir, main page]

Skip to content

Commit 496c4c6

Browse files
Duncan McGregordmcg
authored andcommitted
exceptions-to-values.5 : Introduce Result
1 parent 85da544 commit 496c4c6

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ dependencies {
2020
implementation "com.fasterxml.jackson.core:jackson-databind:2.10.0"
2121
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.0"
2222
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.10.0"
23+
implementation "com.natpryce:result4k:2.0.0"
2324

2425
testImplementation "org.junit.jupiter:junit-jupiter-api:5.4.2"
2526
testImplementation "org.junit.jupiter:junit-jupiter-params:5.4.2"

src/main/java/travelator/marketing/HighValueCustomersReport.kt

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package travelator.marketing
22

3+
import com.natpryce.Failure
4+
import com.natpryce.Result
5+
import com.natpryce.Success
6+
import com.natpryce.recover
7+
38
fun Sequence<String>.toHighValueCustomerReport(
49
onErrorLine: (String) -> Unit = {}
510
): Sequence<String> {
611
val valuableCustomers = this
712
.withoutHeader()
813
.map { line ->
9-
val customerData = line.toCustomerData()
10-
if (customerData == null)
14+
line.toCustomerData().recover {
1115
onErrorLine(line)
12-
customerData
16+
null
17+
}
1318
}
1419
.filterNotNull()
1520
.filter { it.score >= 10 }
@@ -27,23 +32,33 @@ private fun List<CustomerData>.summarised(): String =
2732

2833
private fun Sequence<String>.withoutHeader() = drop(1)
2934

30-
internal fun String.toCustomerData(): CustomerData? =
35+
internal fun String.toCustomerData(): Result<CustomerData, ParseFailure> =
3136
split("\t").let { parts ->
3237
if (parts.size < 4)
33-
return null
38+
return Failure(NotEnoughFieldsFailure(this))
3439
val score = parts[3].toIntOrNull() ?:
35-
return null
40+
return Failure(ScoreIsNotAnIntFailure(this))
3641
val spend = if (parts.size == 4) 0.0 else parts[4].toDoubleOrNull() ?:
37-
return null
38-
CustomerData(
39-
id = parts[0],
40-
givenName = parts[1],
41-
familyName = parts[2],
42-
score = score,
43-
spend = spend
42+
return Failure(SpendIsNotADoubleFailure(this))
43+
Success(
44+
CustomerData(
45+
id = parts[0],
46+
givenName = parts[1],
47+
familyName = parts[2],
48+
score = score,
49+
spend = spend
50+
)
4451
)
4552
}
4653

54+
sealed class ParseFailure(open val line: String)
55+
data class NotEnoughFieldsFailure(override val line: String) :
56+
ParseFailure(line)
57+
data class ScoreIsNotAnIntFailure(override val line: String) :
58+
ParseFailure(line)
59+
data class SpendIsNotADoubleFailure(override val line: String) :
60+
ParseFailure(line)
61+
4762
private val CustomerData.outputLine: String
4863
get() = "$id\t$marketingName\t${spend.toMoneyString()}"
4964

src/test/java/travelator/marketing/HighValueCustomersReportTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package travelator.marketing
22

3+
import com.natpryce.Success
34
import org.junit.jupiter.api.Assertions.assertEquals
45
import org.junit.jupiter.api.Test
56

@@ -40,7 +41,7 @@ class HighValueCustomersReportTests {
4041
@Test
4142
fun emptySpendIs0() {
4243
assertEquals(
43-
CustomerData("1", "Fred", "Flintstone", 0, 0.0),
44+
Success(CustomerData("1", "Fred", "Flintstone", 0, 0.0)),
4445
"1\tFred\tFlintstone\t0".toCustomerData()
4546
)
4647
}

0 commit comments

Comments
 (0)
0