RpcResponse.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. using System;
  2. // ReSharper disable AutoPropertyCanBeMadeGetOnly.Local
  3. // ReSharper disable UnusedMember.Local
  4. namespace EdjCase.JsonRpc.Core
  5. {
  6. public class RpcResponse<T> : RpcResponse
  7. {
  8. public RpcResponse(RpcId id, T result)
  9. :base(id, result, typeof(T))
  10. {
  11. }
  12. public RpcResponse(RpcId id, RpcError error)
  13. :base(id, error)
  14. {
  15. }
  16. public new T Result => (T)base.Result;
  17. public static RpcResponse<T> FromResponse(RpcResponse response)
  18. {
  19. if (response.HasError)
  20. {
  21. return new RpcResponse<T>(response.Id, response.Error);
  22. }
  23. return new RpcResponse<T>(response.Id, (T)response.Result);
  24. }
  25. }
  26. public class RpcResponse
  27. {
  28. protected RpcResponse()
  29. {
  30. }
  31. /// <param name="id">Request id</param>
  32. protected RpcResponse(RpcId id)
  33. {
  34. this.Id = id;
  35. }
  36. /// <param name="id">Request id</param>
  37. /// <param name="error">Request error</param>
  38. public RpcResponse(RpcId id, RpcError error) : this(id)
  39. {
  40. this.Error = error;
  41. }
  42. /// <param name="id">Request id</param>
  43. /// <param name="result">Response result object</param>
  44. public RpcResponse(RpcId id, object result, Type resultType) : this(id)
  45. {
  46. this.Result = result;
  47. this.ResultType = resultType;
  48. }
  49. /// <summary>
  50. /// Request id
  51. /// </summary>
  52. public RpcId Id { get; private set; }
  53. /// <summary>
  54. /// Reponse result object (Required)
  55. /// </summary>
  56. public object Result { get; private set; }
  57. /// <summary>
  58. /// Error from processing Rpc request (Required)
  59. /// </summary>
  60. public RpcError Error { get; private set; }
  61. public bool HasError => this.Error != null;
  62. public Type ResultType { get; }
  63. public void ThrowErrorIfExists()
  64. {
  65. if (this.HasError)
  66. {
  67. throw this.Error.CreateException();
  68. }
  69. }
  70. }
  71. public class RpcError<T> : RpcError
  72. {
  73. public RpcError(RpcErrorCode code, string message, T data)
  74. : base(code, message, data)
  75. {
  76. }
  77. public RpcError(int code, string message, T data)
  78. : base(code, message, data)
  79. {
  80. }
  81. public new T Data => (T)base.Data;
  82. }
  83. /// <summary>
  84. /// Model to represent an Rpc response error
  85. /// </summary>
  86. public class RpcError
  87. {
  88. /// <param name="code">Rpc error code</param>
  89. /// <param name="message">Error message</param>
  90. /// <param name="data">Optional error data</param>
  91. public RpcError(RpcErrorCode code, string message, object data = null)
  92. : this((int)code, message, data)
  93. {
  94. }
  95. /// <param name="code">Rpc error code</param>
  96. /// <param name="message">Error message</param>
  97. /// <param name="data">Optional error data</param>
  98. public RpcError(int code, string message, object data = null)
  99. {
  100. if (string.IsNullOrWhiteSpace(message))
  101. {
  102. throw new ArgumentNullException(nameof(message));
  103. }
  104. this.Code = code;
  105. this.Message = message;
  106. this.Data = data;
  107. this.DataType = data?.GetType();
  108. }
  109. /// <summary>
  110. /// Rpc error code (Required)
  111. /// </summary>
  112. public int Code { get; }
  113. public string Message { get; }
  114. /// <summary>
  115. /// Error data (Optional)
  116. /// </summary>
  117. public object Data { get; }
  118. /// <summary>
  119. /// Type of the data object
  120. /// </summary>
  121. public Type DataType { get; }
  122. public RpcException CreateException()
  123. {
  124. return new RpcException(this.Code, this.Message, data: this.Data);
  125. }
  126. }
  127. }