A message definition.
| 189 | |
| 190 | @dataclass |
| 191 | class Message: |
| 192 | """A message definition.""" |
| 193 | |
| 194 | name: str |
| 195 | type_id: Optional[int] |
| 196 | fields: List[Field] = field(default_factory=list) |
| 197 | nested_messages: List["Message"] = field(default_factory=list) |
| 198 | nested_enums: List["Enum"] = field(default_factory=list) |
| 199 | nested_unions: List["Union"] = field(default_factory=list) |
| 200 | options: dict = field(default_factory=dict) |
| 201 | line: int = 0 |
| 202 | column: int = 0 |
| 203 | location: Optional[SourceLocation] = None |
| 204 | id_generated: bool = False |
| 205 | id_source: Optional[str] = None |
| 206 | source_package: Optional[str] = None |
| 207 | |
| 208 | def __repr__(self) -> str: |
| 209 | id_str = f" [id={self.type_id}]" if self.type_id is not None else "" |
| 210 | nested_str = "" |
| 211 | if self.nested_messages or self.nested_enums or self.nested_unions: |
| 212 | nested_str = f", nested={len(self.nested_messages)}msg+{len(self.nested_enums)}enum+{len(self.nested_unions)}union" |
| 213 | opts_str = f", options={len(self.options)}" if self.options else "" |
| 214 | return ( |
| 215 | f"Message({self.name}{id_str}, fields={self.fields}{nested_str}{opts_str})" |
| 216 | ) |
| 217 | |
| 218 | def get_nested_type( |
| 219 | self, name: str |
| 220 | ) -> Optional[TypingUnion["Message", "Enum", "Union"]]: |
| 221 | """Look up a nested type by name.""" |
| 222 | for msg in self.nested_messages: |
| 223 | if msg.name == name: |
| 224 | return msg |
| 225 | for enum in self.nested_enums: |
| 226 | if enum.name == name: |
| 227 | return enum |
| 228 | for union in self.nested_unions: |
| 229 | if union.name == name: |
| 230 | return union |
| 231 | return None |
| 232 | |
| 233 | |
| 234 | @dataclass |