qjsonreggen.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/env python3
  2. # Syntax: qjsonreggen.py <out_path> <class_name> <modes> ...
  3. # Syntax: qjsonreggen.py super <out_path> <class_names> ...
  4. import sys
  5. import re
  6. from enum import Enum
  7. class Mode(Enum):
  8. ALL = 0
  9. LIST = 1
  10. MAP = 2
  11. SET = 3
  12. POINTER = 4
  13. POINTER_LIST = 5
  14. def escaped(name):
  15. return re.sub(r"\W", "_", name, re.ASCII)
  16. def mode_fn(mode):
  17. if mode == Mode.ALL:
  18. return "registerBasicConverters"
  19. elif mode == Mode.LIST:
  20. return "registerListConverters"
  21. elif mode == Mode.MAP:
  22. return "registerMapConverters"
  23. elif mode == Mode.SET:
  24. return "registerSetConverters"
  25. elif mode == Mode.POINTER:
  26. return "registerPointerConverters"
  27. elif mode == Mode.POINTER_LIST:
  28. return "registerPointerListConverters"
  29. def create_hook(file_name, class_name, *modes):
  30. if len(modes) == 0:
  31. modes = ["all"]
  32. with open(file_name, "w") as file:
  33. file.write('#include "qtjsonserializer_global.h"\n')
  34. file.write('#include "serializerbase.h"\n')
  35. file.write("#include <QtCore/QtCore>\n\n")
  36. file.write("#define QT_JSON_SERIALIZER_NAMED(T) #T\n\n")
  37. file.write("namespace QtJsonSerializer::__private::converter_hooks {\n\n")
  38. file.write("void register_{}_converters() {{\n".format(escaped(class_name)))
  39. for mode_name in modes:
  40. mode = Mode[mode_name.upper()]
  41. if mode == Mode.MAP:
  42. file.write("\tSerializerBase::{}<QString, {}>();\n".format(mode_fn(mode), class_name))
  43. else:
  44. file.write("\tSerializerBase::{}<{}>();\n".format(mode_fn(mode), class_name))
  45. file.write("}\n\n")
  46. file.write("}\n")
  47. def create_super_hook(file_name, *class_names):
  48. with open(file_name, "w") as file:
  49. file.write('#include "qtjsonserializer_global.h"\n\n')
  50. file.write("namespace QtJsonSerializer::__private::converter_hooks {\n\n")
  51. for class_name in class_names:
  52. file.write("void register_{}_converters();\n".format(escaped(class_name)))
  53. file.write("\n}\n\n")
  54. file.write("namespace QtJsonSerializer {\n\n")
  55. file.write("void registerTypes() {\n")
  56. file.write("\tstatic bool wasCalled = false;\n")
  57. file.write("\tif(wasCalled)\n")
  58. file.write("\t\treturn;\n")
  59. file.write("\twasCalled = true;\n")
  60. for class_name in class_names:
  61. file.write("\tQtJsonSerializer::__private::converter_hooks::register_{}_converters();\n".format(escaped(class_name)))
  62. file.write("}\n\n")
  63. file.write("}\n")
  64. if __name__ == "__main__":
  65. if sys.argv[1] == "super":
  66. create_super_hook(sys.argv[2], *sys.argv[3:])
  67. else:
  68. create_hook(sys.argv[1], sys.argv[2], *sys.argv[3:])