jsonrpc.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. use std::str;
  2. use rand::Rng;
  3. use serde::{Deserialize, Serialize};
  4. use serde_json::{json, Value};
  5. use tokio::io::{AsyncReadExt, AsyncWriteExt};
  6. use tokio::net::TcpStream;
  7. use crate::Error;
  8. #[serde(untagged)]
  9. #[derive(Serialize, Deserialize, Debug)]
  10. pub enum JsonResult {
  11. Resp(JsonResponse),
  12. Err(JsonError),
  13. Notif(JsonNotification),
  14. }
  15. #[derive(Serialize, Deserialize, Debug)]
  16. pub struct JsonRequest {
  17. pub jsonrpc: Value,
  18. pub method: Value,
  19. pub params: Value,
  20. pub id: Value,
  21. }
  22. #[derive(Serialize, Deserialize, Debug)]
  23. pub struct JsonErrorVal {
  24. pub code: Value,
  25. pub message: Value,
  26. }
  27. #[derive(Serialize, Deserialize, Debug)]
  28. pub struct JsonError {
  29. pub jsonrpc: Value,
  30. pub error: JsonErrorVal,
  31. pub id: Value,
  32. }
  33. #[derive(Serialize, Deserialize, Debug)]
  34. pub struct JsonResponse {
  35. pub jsonrpc: Value,
  36. pub result: Value,
  37. pub id: Value,
  38. }
  39. #[derive(Serialize, Deserialize, Debug)]
  40. pub struct JsonNotification {
  41. pub jsonrpc: Value,
  42. pub method: Value,
  43. pub params: Value,
  44. }
  45. pub fn request(m: Value, p: Value) -> JsonRequest {
  46. let mut rng = rand::thread_rng();
  47. JsonRequest {
  48. jsonrpc: json!("2.0"),
  49. method: m,
  50. params: p,
  51. id: json!(rng.gen::<u32>()),
  52. }
  53. }
  54. pub fn response(r: Value, i: Value) -> JsonResponse {
  55. JsonResponse {
  56. jsonrpc: json!("2.0"),
  57. result: r,
  58. id: i,
  59. }
  60. }
  61. pub fn error(c: i64, m: String, i: Value) -> JsonError {
  62. let ev = JsonErrorVal {
  63. code: json!(c),
  64. message: json!(m),
  65. };
  66. JsonError {
  67. jsonrpc: json!("2.0"),
  68. error: ev,
  69. id: i,
  70. }
  71. }
  72. pub fn notification(m: Value, p: Value) -> JsonNotification {
  73. JsonNotification {
  74. jsonrpc: json!("2.0"),
  75. method: m,
  76. params: p,
  77. }
  78. }
  79. pub async fn send_request(url: String, data: Value) -> Result<JsonResult, Error> {
  80. // TODO: TLS
  81. let mut buf = [0; 2048];
  82. let mut stream = TcpStream::connect(url).await?;
  83. let data_str = serde_json::to_string(&data)?;
  84. stream.write_all(&data_str.as_bytes()).await?;
  85. let bytes_read = stream.read(&mut buf[..]).await?;
  86. let reply: JsonResult = serde_json::from_slice(&buf[0..bytes_read])?;
  87. Ok(reply)
  88. }