/*******************************************************************************
 * Copyright (c) 2016 Bruno Medeiros and other Contributors.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Bruno Medeiros - initial API and implementation
 *******************************************************************************/
package melnorme.lang.tooling.toolchain.ops;

/**
 * Result for a tool operation. 
 * An exception result should be only be used for non-critical failures, that is,
 * only if the tool was successfully started but could not complete the operation 
 * due to an error in the data being analyzed.
 * 
 * Critical failures, such as the tool not being found in the first place, or the tool crashing, 
 * these should be handled with a different class.
 *
 */
public class ToolResponse<DATA> {
	
	protected final DATA resultData; // can be null
	protected final String errorMessage;
	
	public ToolResponse(DATA resultValue) {
		this(resultValue, null);
	}
	
	public ToolResponse(DATA resultData, String errorMessaage) {
		this.resultData = resultData;
		this.errorMessage = errorMessaage;
	}
	
	public static <DATA> ToolResponse<DATA> newError(String errorMessage) {
		return new ToolResponse<DATA>(null, errorMessage);
	}
	
	public DATA getResultData() {
		return resultData;
	}
	
	public String getErrorMessage() {
		return getStatusMessageText();
	}
	
	public String getStatusMessageText() {
		return errorMessage;
	}
	
	public boolean isErrorResult() {
		return errorMessage != null;
	}
	
	public final boolean isValidResult() {
		return !isErrorResult();
	}
	
	public DATA getValidResult() throws OperationSoftFailure {
		if(isErrorResult()) {
			throw new OperationSoftFailure(getErrorMessage());
		}
		return getResultData();
	}
	
}