Emit ``switch (discriminator) { case Enum::M: ; break; ... }``. ``cases`` is a sequence of ``(member_or_members, body)`` pairs: - When ``member_or_members`` is a ``str``, the case label + body + break collapse onto one line: ``case Enum::M: ; break;``. - When it
(
discriminator: str,
enum_name: str,
cases: Sequence[Tuple[Any, str]],
*,
indent: str = " ",
default_break: bool = False,
default_body: Optional[str] = None,
)
| 753 | |
| 754 | |
| 755 | def emit_enum_switch( |
| 756 | discriminator: str, |
| 757 | enum_name: str, |
| 758 | cases: Sequence[Tuple[Any, str]], |
| 759 | *, |
| 760 | indent: str = " ", |
| 761 | default_break: bool = False, |
| 762 | default_body: Optional[str] = None, |
| 763 | ) -> str: |
| 764 | """Emit ``switch (discriminator) { case Enum::M: <body>; break; ... }``. |
| 765 | |
| 766 | ``cases`` is a sequence of ``(member_or_members, body)`` pairs: |
| 767 | - When ``member_or_members`` is a ``str``, the case label + body + |
| 768 | break collapse onto one line: ``case Enum::M: <body>; break;``. |
| 769 | - When it is a sequence of strings (multi-key group, e.g. objtype |
| 770 | dispatch's BODY/XBODY → ``mjOBJ_BODY``), the case labels stack |
| 771 | and the body / break go on separate indented lines: |
| 772 | ``case Enum::A:`` |
| 773 | ``case Enum::B:`` |
| 774 | `` <body>;`` |
| 775 | `` break;`` |
| 776 | |
| 777 | ``default_break=True`` appends a single-line ``default: break;``. |
| 778 | ``default_body`` (when set) appends a multi-line ``default:`` arm |
| 779 | with that body. ``default_break`` is ignored if ``default_body`` is |
| 780 | given. |
| 781 | |
| 782 | All lines are prefixed with ``indent``; case labels use |
| 783 | ``indent + 4 spaces``; multi-line bodies use ``indent + 8 spaces``. |
| 784 | Result ends with a trailing newline. |
| 785 | """ |
| 786 | inner = indent + " " |
| 787 | body_indent = inner + " " |
| 788 | lines: List[str] = [] |
| 789 | lines.append(f"{indent}switch ({discriminator})") |
| 790 | lines.append(f"{indent}{{") |
| 791 | for members, body in cases: |
| 792 | if isinstance(members, str): |
| 793 | lines.append(f"{inner}case {enum_name}::{members}: {body}; break;") |
| 794 | continue |
| 795 | for m in members: |
| 796 | lines.append(f"{inner}case {enum_name}::{m}:") |
| 797 | lines.append(f"{body_indent}{body};") |
| 798 | lines.append(f"{body_indent}break;") |
| 799 | if default_body is not None: |
| 800 | lines.append(f"{inner}default:") |
| 801 | lines.append(f"{body_indent}{default_body};") |
| 802 | lines.append(f"{body_indent}break;") |
| 803 | elif default_break: |
| 804 | lines.append(f"{inner}default: break;") |
| 805 | lines.append(f"{indent}}}") |
| 806 | return "\n".join(lines) + "\n" |
| 807 | |
| 808 | |
| 809 | def _emit_xml_enum_export(attr: str, enum_def: Dict[str, Any]) -> str: |
no outgoing calls
no test coverage detected