jsonrpc.rs 4.1 KB

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