001package com.mrivanplays.process;
002
003import java.util.Objects;
004import java.util.Optional;
005
006/**
007 * Represents a result of a {@link ResultedProcess}
008 *
009 * @param <T> type parameter
010 * @author <a href="mailto:ivan@mrivanplays.com">Ivan Pekov</a>
011 * @since 0.0.1
012 */
013public final class ProcessResult<T> {
014
015  /**
016   * Create a successful {@code ProcessResult}
017   *
018   * @param value result value
019   * @return new process result
020   * @param <T> type parameter
021   */
022  public static <T> ProcessResult<T> success(T value) {
023    return new ProcessResult<>(
024        Optional.of(Objects.requireNonNull(value, "value")), Optional.empty());
025  }
026
027  /**
028   * Create a failure {@code ProcessResult}
029   *
030   * @param error why has the process failed
031   * @return new process result
032   * @param <T> type parameter
033   */
034  public static <T> ProcessResult<T> failure(ProcessException error) {
035    return new ProcessResult<>(
036        Optional.empty(), Optional.of(Objects.requireNonNull(error, "error")));
037  }
038
039  /**
040   * Returns whether this {@code ProcessResult} is successful.
041   *
042   * @return true if successful
043   */
044  public boolean isSuccessful() {
045    return this.value.isPresent() && !this.error.isPresent();
046  }
047
048  /**
049   * Returns the resulted value if present.
050   *
051   * @return resulted value
052   */
053  public Optional<T> getValue() {
054    return this.value;
055  }
056
057  /**
058   * Returns the {@link ProcessException} error if present.
059   *
060   * @return error
061   */
062  public Optional<ProcessException> getError() {
063    return this.error;
064  }
065
066  // ===========================================
067
068  private final Optional<T> value;
069  private final Optional<ProcessException> error;
070
071  private ProcessResult(Optional<T> value, Optional<ProcessException> error) {
072    this.value = value;
073    this.error = error;
074  }
075}