schema.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from dataclasses import dataclass
  2. from pycparser import c_ast
  3. @dataclass
  4. class StructField:
  5. type: str
  6. name: str
  7. desc: str | None = None
  8. @dataclass
  9. class EnumValue:
  10. name: str
  11. value: int | None
  12. desc: str | None = None
  13. @dataclass
  14. class Struct:
  15. name: str | None = None
  16. typedef_name: str | None = None
  17. desc: str | None = None
  18. fields: list[StructField] | None = None
  19. @property
  20. def code_name(self):
  21. if self.typedef_name:
  22. return self.typedef_name
  23. assert self.name is not None
  24. return f'struct {self.name}'
  25. @property
  26. def identifier(self):
  27. if self.name:
  28. return self.name
  29. assert self.typedef_name is not None
  30. return self.typedef_name
  31. @dataclass
  32. class Enum:
  33. name: str
  34. values: list[EnumValue]
  35. desc: str | None = None
  36. @dataclass
  37. class FunctionParam:
  38. type: str
  39. name: str
  40. @dataclass
  41. class Function:
  42. name: str
  43. params: list[FunctionParam]
  44. ret_type: str
  45. desc: str | None = None
  46. def signature(self) -> str:
  47. return f'{self.ret_type} {self.name}({", ".join([f"{param.type} {param.name}" for param in self.params])})'