jsonrpc.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use std::str;
  2. use rand::Rng;
  3. use serde::{Deserialize, Serialize};
  4. use serde_json::{json, Value};
  5. #[derive(Serialize, Deserialize, Debug)]
  6. #[serde(untagged)]
  7. pub enum JsonResult {
  8. Resp(JsonResponse),
  9. Err(JsonError),
  10. Notif(JsonNotification),
  11. }
  12. #[derive(Serialize, Deserialize, Debug)]
  13. pub struct JsonRequest {
  14. pub jsonrpc: Value,
  15. pub method: Value,
  16. pub params: Value,
  17. pub id: Value,
  18. }
  19. #[derive(Serialize, Deserialize, Debug)]
  20. pub struct JsonErrorVal {
  21. pub code: Value,
  22. pub message: Value,
  23. }
  24. #[derive(Serialize, Deserialize, Debug)]
  25. pub struct JsonError {
  26. pub jsonrpc: Value,
  27. pub error: JsonErrorVal,
  28. pub id: Value,
  29. }
  30. #[derive(Serialize, Deserialize, Debug)]
  31. pub struct JsonResponse {
  32. pub jsonrpc: Value,
  33. pub result: Value,
  34. pub id: Value,
  35. }
  36. #[derive(Serialize, Deserialize, Debug)]
  37. pub struct JsonNotification {
  38. pub jsonrpc: Value,
  39. pub method: Value,
  40. pub params: Value,
  41. }
  42. pub fn request(m: Value, p: Value) -> JsonRequest {
  43. let mut rng = rand::thread_rng();
  44. JsonRequest {
  45. jsonrpc: json!("2.0"),
  46. method: m,
  47. params: p,
  48. id: json!(rng.gen::<u32>()),
  49. }
  50. }
  51. pub fn response(r: Value, i: Value) -> JsonResponse {
  52. JsonResponse {
  53. jsonrpc: json!("2.0"),
  54. result: r,
  55. id: i,
  56. }
  57. }
  58. pub fn error(c: i64, m: String, i: Value) -> JsonError {
  59. let ev = JsonErrorVal {
  60. code: json!(c),
  61. message: json!(m),
  62. };
  63. JsonError {
  64. jsonrpc: json!("2.0"),
  65. error: ev,
  66. id: i,
  67. }
  68. }
  69. pub fn notification(m: Value, p: Value) -> JsonNotification {
  70. JsonNotification {
  71. jsonrpc: json!("2.0"),
  72. method: m,
  73. params: p,
  74. }
  75. }