All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.edc.spi.result.Result Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright (c) 2021 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
 *
 *  This program and the accompanying materials are made available under the
 *  terms of the Apache License, Version 2.0 which is available at
 *  https://www.apache.org/licenses/LICENSE-2.0
 *
 *  SPDX-License-Identifier: Apache-2.0
 *
 *  Contributors:
 *       Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
 *
 */

package org.eclipse.edc.spi.result;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * A generic result type.
 */
public class Result extends AbstractResult> {

    private Result(T content, Failure failure) {
        super(content, failure);
    }

    public static Result success() {
        return new Result<>(null, null);
    }

    public static  Result success(T content) {
        return new Result<>(content, null);
    }

    public static  Result failure(String failure) {
        return new Result<>(null, new Failure(List.of(failure)));
    }

    public static  Result failure(List failures) {
        return new Result<>(null, new Failure(failures));
    }


    /**
     * Runs the block provided by the {@link Supplier} and wrap the return into a Result
     *
     * @param supplier The block to execute
     * @return The Result of the supplier call. Success if no {@link Exception} were thrown. Failure otherwise
     */
    public static  Result ofThrowable(Supplier supplier) {
        try {
            return Result.success(supplier.get());
        } catch (Exception e) {
            return Result.failure(e.getMessage());
        }
    }

    /**
     * Converts a {@link Optional} into a result, interpreting the Optional's value as content.
     *
     * @return {@link Result#failure(String)} if the Optional is empty, {@link Result#success(Object)} using the Optional's value otherwise.
     */
    @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
    public static  Result from(Optional opt) {
        return opt.map(Result::success).orElse(Result.failure("Empty optional"));
    }

    /**
     * Merges this result with another one. If both Results are successful, a new one is created with no content. If
     * either this result or {@code other} is a failure, the merged result will be a {@code failure()} and will contain
     * all failure messages, no content. If both results are failures, the merged result will contain failure messages
     * of {@code this} result, then the failure messages of {@code other}.
     */
    public  Result merge(Result other) {
        if (succeeded() && other.succeeded()) {
            return new Result<>(null, null);
        } else {
            var messages = new ArrayList();
            messages.addAll(Optional.ofNullable(getFailure()).map(Failure::getMessages).orElse(Collections.emptyList()));
            messages.addAll(Optional.ofNullable(other.getFailure()).map(Failure::getMessages).orElse(Collections.emptyList()));
            return Result.failure(messages);
        }
    }

    /**
     * Maps this {@link Result} into another, maintaining the basic semantics (failed vs success). If this
     * {@link Result} is successful, the content is discarded. If this {@link Result} failed, the failures are carried
     * over. This method is intended for use when the return type is implicit, for example:
     * 
     *   public Result<Void> someMethod() {
     *      Result<String> result = getStringResult();
     *      return result.mapTo();
     *   }
     * 
* * @see Result#map(Function) * @see Result#mapTo(Class) * @deprecated please use {@link #mapEmpty()} or {@link #mapFailure()}. */ @Deprecated(since = "0.6.4") public Result mapTo() { return mapEmpty(); } /** * Maps this {@link Result} into another, maintaining the basic semantics (failed vs success). If this * {@link Result} is successful, the content is discarded. If this {@link Result} failed, the failures are carried * over. This method is intended for use when an explicit return type is needed, for example when using var: *
     *      Result<String> result = getStringResult();
     *      var voidResult = result.mapTo(Void.class);
     * 
* * @param clazz type of the result, with which the resulting {@link Result} should be parameterized * @see Result#map(Function) * @see Result#mapTo() * @deprecated please use {@link #mapEmpty()} or {@link #mapFailure()}. */ @Deprecated(since = "0.6.4") public Result mapTo(Class clazz) { return mapEmpty(); } /** * Converts this result into an {@link Optional}. When this result is failed, or there is no content, * {@link Optional#isEmpty()} is returned, otherwise the content is the {@link Optional}'s value * * @return {@link Optional#empty()} if failed, or no content, {@link Optional#of(Object)} otherwise. */ public Optional asOptional() { return succeeded() && getContent() != null ? Optional.of(getContent()) : Optional.empty(); } @Override @SuppressWarnings("unchecked") @NotNull protected , C1> R1 newInstance(@Nullable C1 content, @Nullable Failure failure) { return (R1) new Result<>(content, failure); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy