jsonrpc.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. use std::net::{TcpStream, ToSocketAddrs};
  2. use std::str;
  3. use async_std::io::{ReadExt, WriteExt};
  4. use rand::Rng;
  5. use serde::{Deserialize, Serialize};
  6. use serde_json::{json, Value};
  7. use smol::Async;
  8. use crate::Error;
  9. #[derive(Debug, Clone)]
  10. pub enum ErrorCode {
  11. ParseError,
  12. InvalidRequest,
  13. MethodNotFound,
  14. InvalidParams,
  15. InternalError,
  16. InvalidAmountParam,
  17. InvalidNetworkParam,
  18. InvalidTokenIdParam,
  19. InvalidAddressParam,
  20. InvalidSymbolParam,
  21. ServerError(i64),
  22. }
  23. impl ErrorCode {
  24. pub fn code(&self) -> i64 {
  25. match *self {
  26. ErrorCode::ParseError => -32700,
  27. ErrorCode::InvalidRequest => -32600,
  28. ErrorCode::MethodNotFound => -32601,
  29. ErrorCode::InvalidParams => -32602,
  30. ErrorCode::InternalError => -32603,
  31. ErrorCode::InvalidAmountParam => -32010,
  32. ErrorCode::InvalidNetworkParam => -32011,
  33. ErrorCode::InvalidTokenIdParam => -32012,
  34. ErrorCode::InvalidAddressParam => -32013,
  35. ErrorCode::InvalidSymbolParam => -32014,
  36. ErrorCode::ServerError(c) => c,
  37. }
  38. }
  39. pub fn description(&self) -> String {
  40. let desc = match *self {
  41. ErrorCode::ParseError => "Parse error",
  42. ErrorCode::InvalidRequest => "Invalid request",
  43. ErrorCode::MethodNotFound => "Method not found",
  44. ErrorCode::InvalidParams => "Invalid params",
  45. ErrorCode::InternalError => "Internal error",
  46. ErrorCode::InvalidAmountParam => "Invalid amount param",
  47. ErrorCode::InvalidNetworkParam => "Invalid network param",
  48. ErrorCode::InvalidTokenIdParam => "Invalid token id param",
  49. ErrorCode::InvalidAddressParam => "Invalid address param",
  50. ErrorCode::InvalidSymbolParam => "Invalid symbol param",
  51. ErrorCode::ServerError(_) => "Server error",
  52. };
  53. desc.to_string()
  54. }
  55. }
  56. #[derive(Serialize, Deserialize)]
  57. #[serde(untagged)]
  58. pub enum JsonResult {
  59. Resp(JsonResponse),
  60. Err(JsonError),
  61. Notif(JsonNotification),
  62. }
  63. #[derive(Serialize, Deserialize, Clone, Debug)]
  64. pub struct JsonRequest {
  65. pub jsonrpc: Value,
  66. pub method: Value,
  67. pub params: Value,
  68. pub id: Value,
  69. }
  70. #[derive(Serialize, Deserialize, Clone, Debug)]
  71. pub struct JsonErrorVal {
  72. pub code: Value,
  73. pub message: Value,
  74. }
  75. #[derive(Serialize, Deserialize, Clone, Debug)]
  76. pub struct JsonError {
  77. pub jsonrpc: Value,
  78. pub error: JsonErrorVal,
  79. pub id: Value,
  80. }
  81. #[derive(Serialize, Deserialize, Clone, Debug)]
  82. pub struct JsonResponse {
  83. pub jsonrpc: Value,
  84. pub result: Value,
  85. pub id: Value,
  86. }
  87. #[derive(Serialize, Deserialize, Clone, Debug)]
  88. pub struct JsonNotification {
  89. pub jsonrpc: Value,
  90. pub method: Value,
  91. pub params: Value,
  92. }
  93. pub fn request(m: Value, p: Value) -> JsonRequest {
  94. let mut rng = rand::thread_rng();
  95. JsonRequest {
  96. jsonrpc: json!("2.0"),
  97. method: m,
  98. params: p,
  99. id: json!(rng.gen::<u32>()),
  100. }
  101. }
  102. pub fn response(r: Value, i: Value) -> JsonResponse {
  103. JsonResponse {
  104. jsonrpc: json!("2.0"),
  105. result: r,
  106. id: i,
  107. }
  108. }
  109. pub fn error(c: ErrorCode, m: Option<String>, i: Value) -> JsonError {
  110. let ev = JsonErrorVal {
  111. code: json!(c.code()),
  112. message: if m.is_none() {
  113. json!(c.description())
  114. } else {
  115. json!(Some(m))
  116. },
  117. };
  118. JsonError {
  119. jsonrpc: json!("2.0"),
  120. error: ev,
  121. id: i,
  122. }
  123. }
  124. pub fn notification(m: Value, p: Value) -> JsonNotification {
  125. JsonNotification {
  126. jsonrpc: json!("2.0"),
  127. method: m,
  128. params: p,
  129. }
  130. }
  131. pub async fn send_request(url: &str, data: Value) -> Result<JsonResult, Error> {
  132. let use_tls: bool;
  133. let parsed_url = url::Url::parse(url)?;
  134. match parsed_url.scheme() {
  135. "tcp" => use_tls = false,
  136. "tls" => use_tls = true,
  137. _ => return Err(Error::UrlParseError),
  138. }
  139. // TODO: Error handling
  140. let host = parsed_url.host().unwrap().to_string();
  141. let port = parsed_url.port().unwrap();
  142. let socket_addr = {
  143. let host = host.clone();
  144. smol::unblock(move || (host.as_str(), port).to_socket_addrs())
  145. .await?
  146. .next()
  147. .ok_or(Error::UrlParseError)?
  148. };
  149. let mut buf = [0; 2048];
  150. let bytes_read: usize;
  151. let data_str = serde_json::to_string(&data)?;
  152. let mut stream = Async::<TcpStream>::connect(socket_addr).await?;
  153. if use_tls {
  154. let mut stream = async_native_tls::connect(&host, stream).await?;
  155. stream.write_all(&data_str.as_bytes()).await?;
  156. bytes_read = stream.read(&mut buf[..]).await?;
  157. } else {
  158. stream.write_all(&data_str.as_bytes()).await?;
  159. bytes_read = stream.read(&mut buf[..]).await?;
  160. }
  161. let reply: JsonResult = serde_json::from_slice(&buf[0..bytes_read])?;
  162. Ok(reply)
  163. }