Vavr - either...

0

Znowu ja, ktoś mi może podpowiedzieć, czy jestem wstanie to jakoś sklecić wszystko tak by wywalić tego ifa?

Option<TaskFile> taskFileOption = taskFileRepository.findFileById(fileId)
                .filter(taskFile -> username.equals(taskFile.getOwner()));

        if (taskFileOption.isEmpty()) {
            return Either.left(ErrorWrapper.of("test1"));
        }

        return taskFileOption
                .flatMap(taskEnvironment::createTaskEnvironment)
                .map(taskEnvironment ->
                        Task.builder()
                                .taskName(taskName)
                                .createdAt(Task.createTimestamp())
                                .taskStatus(TaskStatus.CREATED)
                                .taskEnvironment(taskEnvironment)
                                .build())
                .peek(task -> taskRepository.createTask(task, username))
                .map(TaskCreateResponse::of)
                .toEither(() -> ErrorWrapper.of(test2"));

Na wyjściu Either<ErrorWrapper, TaskCreateResponse>

1

Option ma metodę toEither którą możesz tu użyć zamiast ifa

3

Spróbuj z mapLeft i zmergowaniem eitherów

2

Żonglowanie efektami w Javie bywa upierdliwe. Tutaj mógłbyś to zrobić pi razy drzwi tak (pisane z palca, nie wiem czy się kompiluje/działa). Zakładam, że jedyną operacją która może spowodować powstanie błędu "test2" jest createTaskEnvironment. Dodatkowo, przeglądając taki kod na pewno mocno zastanowiłbym się dlaczego używasz peek zamiast przykładowo flatMap - operacja createTask wygląda na dość ważną i taką, która może się nie powieść.

Option<TaskFile> taskFileOption = taskFileRepository.findFileById(fileId)
                .filter(taskFile -> username.equals(taskFile.getOwner()))
                .toEither(() -> ErrorWrapper.of("test1"))
                .flatMap(taskFile -> taskEnvironment.createTaskEnvironment(taskFile).toEither(() -> ErrorWrapper.of("test2")))
                .map(taskEnvironment ->
                        Task.builder()
                                .taskName(taskName)
                                .createdAt(Task.createTimestamp())
                                .taskStatus(TaskStatus.CREATED)
                                .taskEnvironment(taskEnvironment)
                                .build())
                .peek(task -> taskRepository.createTask(task, username))
                .map(TaskCreateResponse::of);

W 1.0.0 będzie można troszkę inaczej bo w końcu będzie chociażby fold na Option.

0

@eithervavr:

fun foo(): Either<Error, TaskResponse> {
    return findFileById()
            .toEither(Error("test1"))
            .flatMap { taskFile ->
                createTaskEnvironment(taskFile)
                        .toEither(Error("test2"))
                        .map { Task(it) }
                        .peek { createTask(it) }
                        .map { TaskResponse(it) }
            }
}

data class TaskFile(val foo: String)

fun findFileById() = Option.some(TaskFile(""))

data class TaskEnvironment(val foo: String)

fun createTaskEnvironment(taskFile: TaskFile) = Option.some(TaskEnvironment(""))

data class Task(val taskEnvironment: TaskEnvironment)

data class TaskResponse(val task: Task)

data class Error(val foo: String)

fun createTask(task: Task) = task

Nie wiem tylko czy wszystkie metody mają sygnatury jak u Ciebie

1 użytkowników online, w tym zalogowanych: 0, gości: 1