using System; // ReSharper disable AutoPropertyCanBeMadeGetOnly.Local // ReSharper disable UnusedMember.Local namespace EdjCase.JsonRpc.Core { public class RpcResponse : RpcResponse { public RpcResponse(RpcId id, T result) :base(id, result, typeof(T)) { } public RpcResponse(RpcId id, RpcError error) :base(id, error) { } public new T Result => (T)base.Result; public static RpcResponse FromResponse(RpcResponse response) { if (response.HasError) { return new RpcResponse(response.Id, response.Error); } return new RpcResponse(response.Id, (T)response.Result); } } public class RpcResponse { protected RpcResponse() { } /// Request id protected RpcResponse(RpcId id) { this.Id = id; } /// Request id /// Request error public RpcResponse(RpcId id, RpcError error) : this(id) { this.Error = error; } /// Request id /// Response result object public RpcResponse(RpcId id, object result, Type resultType) : this(id) { this.Result = result; this.ResultType = resultType; } /// /// Request id /// public RpcId Id { get; private set; } /// /// Reponse result object (Required) /// public object Result { get; private set; } /// /// Error from processing Rpc request (Required) /// public RpcError Error { get; private set; } public bool HasError => this.Error != null; public Type ResultType { get; } public void ThrowErrorIfExists() { if (this.HasError) { throw this.Error.CreateException(); } } } public class RpcError : RpcError { public RpcError(RpcErrorCode code, string message, T data) : base(code, message, data) { } public RpcError(int code, string message, T data) : base(code, message, data) { } public new T Data => (T)base.Data; } /// /// Model to represent an Rpc response error /// public class RpcError { /// Rpc error code /// Error message /// Optional error data public RpcError(RpcErrorCode code, string message, object data = null) : this((int)code, message, data) { } /// Rpc error code /// Error message /// Optional error data public RpcError(int code, string message, object data = null) { if (string.IsNullOrWhiteSpace(message)) { throw new ArgumentNullException(nameof(message)); } this.Code = code; this.Message = message; this.Data = data; this.DataType = data?.GetType(); } /// /// Rpc error code (Required) /// public int Code { get; } public string Message { get; } /// /// Error data (Optional) /// public object Data { get; } /// /// Type of the data object /// public Type DataType { get; } public RpcException CreateException() { return new RpcException(this.Code, this.Message, data: this.Data); } } }