using System;
using System.Diagnostics;
namespace iiie.Logs.DBO
{
///
/// Represent the result of an operation, with details in case of failure and data in case of success
///
/// The data type
public class OpResult
{
///
/// Status of the operation
///
public ResultStatus Status { get; set; }
///
/// True if Status is Success, false otherwise
///
public bool Success
{
get
{
return Status == ResultStatus.Success;
}
}
///
/// Details on the error, or null if error details must not be shown to the user
/// Only relevent when Success is false
///
public string PublicDetails { get; set; }
///
/// Technical details on the error
/// Only relevent when Success is false
///
public string PrivateDetails { get; set; }
///
/// Original error stack trace
///
public StackFrame[] StackFrames { get; set; }
///
/// Caught exception, if any
///
public Exception Exception { get; set; }
///
/// The data returned by the call
/// Only relevent if Success is true
///
public T Data { get; set; }
///
/// Create and returns a new OpResult with
/// {Public,Private}Details = null, Data = data, Status = true
/// Used for successfull operations
///
public static OpResult Ok(T data)
{
return new OpResult
{
PublicDetails = null,
PrivateDetails = null,
StackFrames = new StackTrace().GetFrames(),
Data = data,
Status = ResultStatus.Success
};
}
///
/// Create and returns a new OpResult with
/// PrivateDetails = privateDetails, Data = null, Status = status
/// If publicDetails == "", privateDetails will be used
/// Used for all errors (invalid input, ...)
///
public static OpResult Error(ResultStatus status, string privateDetails, string publicDetails = null)
{
return new OpResult
{
PublicDetails = publicDetails == "" ? privateDetails : publicDetails,
PrivateDetails = privateDetails,
StackFrames = new StackTrace().GetFrames(),
Data = default(T),
Status = status
};
}
///
/// Create and returns a new OpResult with
/// PrivateDetails = e to string, Data = null, Status = status
/// If publicDetails == "", privateDetails will be used
/// Used for all errors (invalid input, ...)
///
public static OpResult Error(ResultStatus status, Exception e, string userDetails = null)
{
string message = "";
Exception inner = e;
while (inner != null)
{
message += inner.GetType().Name + ": " + inner.Message + (inner.InnerException != null ? "\n" : "");
inner = inner.InnerException;
}
var res = Error(status, message, userDetails);
res.Exception = e;
return res;
}
///
/// Translate an error to another type
///
/// The original type
/// The original error
/// The original error with the type T
public static OpResult Error(OpResult other)
{
return new OpResult
{
PublicDetails = other.PublicDetails,
PrivateDetails = other.PrivateDetails,
StackFrames = other.StackFrames,
Data = default(T),
Status = other.Status
};
}
///
/// Translate an error to another type
///
/// The original type
/// The original error with the type T
public OpResult To()
{
return OpResult.Error(this);
}
///
/// Implicit converion to bool
///
/// The result to be converted
/// True if Success, false otherwise
public static implicit operator bool(OpResult res)
{
return res.Success;
}
protected OpResult()
{
}
}
}