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}