build_jsonrpc.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/usr/bin/env python3
  2. import json
  3. from sys import argv, stderr
  4. def main(path):
  5. print(f"Opening {path}", file=stderr)
  6. with open(path, "r") as f:
  7. lines = [line.strip() for line in f.readlines()]
  8. methods = []
  9. parsing = False
  10. parsing_request = False
  11. parsing_response = False
  12. method = ""
  13. comment = ""
  14. request_lines = []
  15. response_lines = []
  16. start_line = 0
  17. for idx, line in enumerate(lines):
  18. if not line.startswith("//"):
  19. if parsing_response and response_lines:
  20. request_json = " ".join(request_lines)
  21. response_json = " ".join(response_lines)
  22. parsed_req = json.loads(request_json)
  23. parsed_res = json.loads(response_json)
  24. methods.append({
  25. "method": parsed_req["method"],
  26. "comment": comment.strip(),
  27. "request": json.dumps(parsed_req, indent=2),
  28. "response": json.dumps(parsed_res, indent=2),
  29. "line": start_line
  30. })
  31. parsing = False
  32. parsing_request = False
  33. parsing_response = False
  34. request_lines = []
  35. response_lines = []
  36. continue
  37. text = line[2:].strip()
  38. if text == "RPCAPI:":
  39. if parsing_response and response_lines:
  40. request_json = " ".join(request_lines)
  41. response_json = " ".join(response_lines)
  42. parsed_req = json.loads(request_json)
  43. parsed_res = json.loads(response_json)
  44. methods.append({
  45. "method": parsed_req["method"],
  46. "comment": comment.strip(),
  47. "request": json.dumps(parsed_req, indent=2),
  48. "response": json.dumps(parsed_res, indent=2),
  49. "line": start_line
  50. })
  51. parsing_request = False
  52. parsing_response = False
  53. request_lines = []
  54. response_lines = []
  55. parsing = True
  56. start_line = idx + 1
  57. comment = ""
  58. continue
  59. if not parsing:
  60. continue
  61. if text.startswith("-->"):
  62. parsing_request = True
  63. request_lines = [text[3:].strip()]
  64. continue
  65. if text.startswith("<--"):
  66. parsing_request = False
  67. parsing_response = True
  68. response_lines = [text[3:].strip()]
  69. continue
  70. if parsing_response:
  71. response_lines.append(text)
  72. elif parsing_request:
  73. request_lines.append(text)
  74. else:
  75. comment += text + "\n"
  76. if parsing_response and response_lines:
  77. request_json = " ".join(request_lines)
  78. response_json = " ".join(response_lines)
  79. parsed_req = json.loads(request_json)
  80. parsed_res = json.loads(response_json)
  81. methods.append({
  82. "method": parsed_req["method"],
  83. "comment": comment.strip(),
  84. "request": json.dumps(parsed_req, indent=2),
  85. "response": json.dumps(parsed_res, indent=2),
  86. "line": start_line
  87. })
  88. for m in methods:
  89. anchor = m["method"].replace(".", "").replace("/", "").lower()
  90. ghlink = f"https://codeberg.org/darkrenaissance/darkfi/src/branch/master/{path.replace('../', '')}#L{m['line']}"
  91. print(f"### `{m['method']}` <sup><a href=\"{ghlink}\">[source]</a></sup>\n")
  92. if m["comment"]:
  93. print(f"{m['comment']}\n")
  94. print("**Request:**\n")
  95. print("```json")
  96. print(m["request"])
  97. print("```\n")
  98. print("**Response:**\n")
  99. print("```json")
  100. print(m["response"])
  101. print("```\n")
  102. if __name__ == "__main__":
  103. main(argv[1])