jsonrpc.rs 4.1 KB

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