Skip to content

Commit 8573375

Browse files
Merge pull request #903 from zeesh49/KTLN-654-Railway-Orient-Programming-in-Kotlin
Code added for KTLN-654: Railway Oriented Programming
2 parents d74a21e + b275599 commit 8573375

File tree

3 files changed

+80
-0
lines changed
  • kotlin-patterns/src

3 files changed

+80
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.baeldung.railwayorientedprogramming
2+
3+
data class Customer(val name: String, val emailAddress: String)
4+
5+
object ROP {
6+
fun createAndSave(args: Array<String>): Result<String> {
7+
return validateName(args.toList()) then ::validateEmail then ::createCustomerDAO then ::save
8+
}
9+
10+
fun validateName(inp: List<String>): Result<List<String>> {
11+
if(inp.get(0).length < 10) {
12+
return Failure("Name validation failed. Name must be greater than 10 characters.")
13+
}else{
14+
return Success(inp)
15+
}
16+
}
17+
18+
fun validateEmail(inp: List<String>): Result<List<String>> {
19+
if(inp.get(1).contains("@")) {
20+
return Success(inp)
21+
}else{
22+
return Failure("Email validation failed. Email must contain '@' symbol.")
23+
}
24+
}
25+
26+
fun createCustomerDAO(inp: List<String>): Result<Customer> = Success(Customer(inp.get(0), inp.get(1)))
27+
28+
fun save(customer: Customer): Result<String> { return Success("Customer successfully saved: " + customer) }
29+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.baeldung.railwayorientedprogramming
2+
3+
sealed class Result<T>
4+
data class Success<T>(val value: T): Result<T>()
5+
data class Failure<T>(val errorMessage: String): Result<T>()
6+
infix fun <T,U> Result<T>.then(f: (T) -> Result<U>) =
7+
when (this) {
8+
is Success -> f(this.value)
9+
is Failure -> Failure(this.errorMessage)
10+
}
11+
12+
infix fun <T> Result<T>.otherwise(f: (String) -> Unit) =
13+
if (this is Failure) f(this.errorMessage) else Unit
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.railwayorientedprogramming
2+
3+
import org.junit.jupiter.api.Assertions.assertInstanceOf
4+
import org.junit.jupiter.api.Test
5+
6+
class ROPUnitTest {
7+
@Test
8+
fun `create and save customer successfully`() {;
9+
val customer = Customer("Zeeshan Arif Saeed"
10+
11+
val res = ROP.createAndSave(arrayOf("Zeeshan Arif Saeed"
12+
13+
assertInstanceOf(res::class.java,
14+
Success("Customer successfully saved: " + customer))
15+
}
16+
17+
@Test
18+
fun `create and save customer name validatation failure`() {;
19+
val customer = Customer("Zeeshan"
20+
21+
val res = ROP.createAndSave(arrayOf("Zeeshan"
22+
23+
assertInstanceOf(res::class.java,
24+
Failure<String>("Name validation failed. Name must be greater than 10 characters.")
25+
)
26+
}
27+
28+
@Test
29+
fun `create and save customer email validatation failure`() {;
30+
val customer = Customer("Zeeshan Arif Saeed"
31+
32+
val res = ROP.createAndSave(arrayOf("Zeeshan"
33+
34+
assertInstanceOf(res::class.java,
35+
Failure<String>("Email validation failed. Email must contain '@' symbol.")
36+
)
37+
}
38+
}

0 commit comments

Comments
 (0)