MCPcopy Create free account
hub / github.com/apache/fory / generate_union

Method generate_union

compiler/fory_compiler/generators/dart.py:828–978  ·  view source on GitHub ↗
(
        self,
        union: Union,
        indent: int,
        parent_stack: Optional[List[Message]] = None,
    )

Source from the content-addressed store, hash-verified

826 return lines
827
828 def generate_union(
829 self,
830 union: Union,
831 indent: int,
832 parent_stack: Optional[List[Message]] = None,
833 ) -> List[str]:
834 parent_stack = parent_stack or []
835 name = self.local_name(union)
836 full = self.ref_name(union)
837 case_name = f"{name}Case"
838 lines = [f"{self.indent_str * indent}enum {case_name} {{"]
839 for i, field in enumerate(union.fields):
840 suffix = "," if i < len(union.fields) - 1 else ";"
841 lines.append(
842 f"{self.indent_str * (indent + 1)}{self.safe_identifier(self.to_camel_case(field.name))}{suffix}"
843 )
844 lines.extend(
845 [
846 "",
847 f"{self.indent_str * (indent + 1)}int get id => switch (this) {{",
848 ]
849 )
850 for field in union.fields:
851 case = self.safe_identifier(self.to_camel_case(field.name))
852 lines.append(
853 f"{self.indent_str * (indent + 2)}{case_name}.{case} => {field.number},"
854 )
855 lines.extend(
856 [
857 f"{self.indent_str * (indent + 1)}}};",
858 f"{self.indent_str * indent}}}",
859 "",
860 f"{self.indent_str * indent}@ForyUnion()",
861 f"{self.indent_str * indent}final class {name} {{",
862 f"{self.indent_str * (indent + 1)}final {case_name} _case;",
863 f"{self.indent_str * (indent + 1)}final Object? _value;",
864 "",
865 f"{self.indent_str * (indent + 1)}const {name}._(this._case, this._value);",
866 "",
867 ]
868 )
869 for field in union.fields:
870 case = self.safe_identifier(self.to_camel_case(field.name))
871 lines.append(
872 f"{self.indent_str * (indent + 1)}factory {name}.{case}({self.dart_type(field.field_type, parent_stack=parent_stack)} value) => {name}._({case_name}.{case}, value);"
873 )
874 lines.extend(
875 [
876 "",
877 f"{self.indent_str * (indent + 1)}{case_name} get caseValue => _case;",
878 f"{self.indent_str * (indent + 1)}int get caseId => _case.id;",
879 f"{self.indent_str * (indent + 1)}Object? get value => _value;",
880 "",
881 ]
882 )
883 for field in union.fields:
884 case = self.safe_identifier(self.to_camel_case(field.name))
885 t = self.dart_type(field.field_type, parent_stack=parent_stack)

Callers 2

generate_fileMethod · 0.95
generate_messageMethod · 0.95

Calls 11

local_nameMethod · 0.95
ref_nameMethod · 0.95
safe_identifierMethod · 0.95
dart_typeMethod · 0.95
module_type_nameMethod · 0.95
_field_info_linesMethod · 0.95
to_camel_caseMethod · 0.80
extendMethod · 0.80
to_pascal_caseMethod · 0.80
appendMethod · 0.45

Tested by

no test coverage detected