enum.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python3
  2. # ex: set filetype=python:
  3. """Generate code to handle XDR enum types"""
  4. from generators import SourceGenerator, create_jinja2_environment
  5. from xdr_ast import _XdrEnum, public_apis, big_endian, get_header_name
  6. from xdr_parse import get_xdr_enum_validation
  7. class XdrEnumGenerator(SourceGenerator):
  8. """Generate source code for XDR enum types"""
  9. def __init__(self, language: str, peer: str):
  10. """Initialize an instance of this class"""
  11. self.environment = create_jinja2_environment(language, "enum")
  12. self.peer = peer
  13. def emit_declaration(self, node: _XdrEnum) -> None:
  14. """Emit one declaration pair for an XDR enum type"""
  15. if node.name in public_apis:
  16. template = self.environment.get_template("declaration/enum.j2")
  17. print(template.render(name=node.name))
  18. def emit_definition(self, node: _XdrEnum) -> None:
  19. """Emit one definition for an XDR enum type"""
  20. template = self.environment.get_template("definition/open.j2")
  21. print(template.render(name=node.name))
  22. template = self.environment.get_template("definition/enumerator.j2")
  23. for enumerator in node.enumerators:
  24. print(template.render(name=enumerator.name, value=enumerator.value))
  25. if node.name in big_endian:
  26. template = self.environment.get_template("definition/close_be.j2")
  27. else:
  28. template = self.environment.get_template("definition/close.j2")
  29. print(template.render(name=node.name))
  30. def emit_decoder(self, node: _XdrEnum) -> None:
  31. """Emit one decoder function for an XDR enum type"""
  32. if node.name in big_endian:
  33. template = self.environment.get_template("decoder/enum_be.j2")
  34. else:
  35. template = self.environment.get_template("decoder/enum.j2")
  36. print(
  37. template.render(
  38. name=node.name,
  39. enumerators=node.enumerators,
  40. validate=get_xdr_enum_validation(),
  41. )
  42. )
  43. def emit_encoder(self, node: _XdrEnum) -> None:
  44. """Emit one encoder function for an XDR enum type"""
  45. if node.name in big_endian:
  46. template = self.environment.get_template("encoder/enum_be.j2")
  47. else:
  48. template = self.environment.get_template("encoder/enum.j2")
  49. print(template.render(name=node.name))
  50. def emit_maxsize(self, node: _XdrEnum) -> None:
  51. """Emit one maxsize macro for an XDR enum type"""
  52. macro_name = get_header_name().upper() + "_" + node.name + "_sz"
  53. template = self.environment.get_template("maxsize/enum.j2")
  54. print(
  55. template.render(
  56. macro=macro_name,
  57. width=" + ".join(node.symbolic_width()),
  58. )
  59. )