Skip to content

Commit 4ba8b93

Browse files
authored
DataContainer.to_dict() (#2758)
1 parent 8af7cc4 commit 4ba8b93

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

kafka/protocol/new/data_container.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,34 @@ def __iter__(self):
110110
raise RuntimeError('DataContainer Iteration not supported without _version')
111111
return iter([getattr(self, field.name) for field in self._struct.untagged_fields(self._version)])
112112

113+
def _to_dict_vals(self, meta=False, json=True):
114+
if meta:
115+
yield ('_type', self.__class__.__name__)
116+
yield ('_version', self._version)
117+
if meta != 'all':
118+
meta=False
119+
for field in self._struct._fields:
120+
if self._version is not None and not field.for_version_q(self._version):
121+
continue
122+
if field.is_struct():
123+
yield (field.name, dict(getattr(self, field.name)._to_dict_vals(meta=meta, json=json)))
124+
elif field.is_struct_array():
125+
yield (field.name, [dict(val._to_dict_vals(meta=meta, json=json)) for val in getattr(self, field.name)])
126+
else:
127+
val = getattr(self, field.name)
128+
if json:
129+
if isinstance(val, bytes):
130+
val = val.decode()
131+
elif isinstance(val, set):
132+
val = list(val)
133+
yield (field.name, val)
134+
135+
def to_dict(self, meta=False, json=True):
136+
"""Use meta=True to include top-level version; meta='all' to include all internal versions
137+
json=False to return raw encoding; json=True (default) to convert values to be json-serializable
138+
"""
139+
return dict(self._to_dict_vals(meta=meta, json=json))
140+
113141
def __getitem__(self, key):
114142
if self._version is None:
115143
raise RuntimeError('DataContainer subscript not supported without _version')

0 commit comments

Comments
 (0)