/
UseCase.kt
48 lines (39 loc) · 1.59 KB
/
UseCase.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.github.aantoniadis.delivery.usecases.core
import java.util.concurrent.CompletableFuture
import java.util.concurrent.CompletionStage
interface UseCase<in Request, out Response> {
fun execute(request: Request): Response
}
interface UseCaseExecutor {
operator fun <RequestDto, ResponseDto, Request, Response> invoke(
useCase: UseCase<Request, Response>,
requestDto: RequestDto,
requestConverter: (RequestDto) -> Request,
responseConverter: (Response) -> ResponseDto
): CompletionStage<ResponseDto>
operator fun <RequestDto, Request> invoke(
useCase: UseCase<Request, Unit>,
requestDto: RequestDto,
requestConverter: (RequestDto) -> Request
) =
invoke(useCase, requestDto, requestConverter, {})
operator fun invoke(useCase: UseCase<Unit, Unit>) =
invoke(useCase, Unit, { })
operator fun <ResponseDto, Response> invoke(
useCase: UseCase<Unit, Response>,
responseConverter: (Response) -> ResponseDto
) =
invoke(useCase, Unit, { }, responseConverter)
}
class UseCaseExecutorImp : UseCaseExecutor {
override operator fun <RequestDto, ResponseDto, Request, Response> invoke(
useCase: UseCase<Request, Response>,
requestDto: RequestDto,
requestConverter: (RequestDto) -> Request,
responseConverter: (Response) -> ResponseDto
): CompletionStage<ResponseDto> =
CompletableFuture
.supplyAsync { requestConverter(requestDto) }
.thenApplyAsync { useCase.execute(it) }
.thenApplyAsync { responseConverter(it) }
}