Skip to content

Commit efda076

Browse files
committed
Worked on structure group support
1 parent 4f5ec5c commit efda076

File tree

7 files changed

+43
-9
lines changed

7 files changed

+43
-9
lines changed

config/dpkg/changelog

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
dtfabric (20230519-1) unstable; urgency=low
1+
dtfabric (20230520-1) unstable; urgency=low
22

33
* Auto-generated
44

5-
-- Joachim Metz <[email protected]> Fri, 19 May 2023 04:56:42 +0200
5+
-- Joachim Metz <[email protected]> Sat, 20 May 2023 05:28:59 +0200

docs/sources/Format-specification.md

+7
Original file line numberDiff line numberDiff line change
@@ -537,3 +537,10 @@ members:
537537
538538
The structure group members are required to define the identifier structure
539539
member with its values specific to the group member.
540+
541+
Attribute name | Attribute type | Required | Description
542+
--- | --- | --- | ---
543+
base | string | Yes | Base data type. Note that this must be a structure data type.
544+
default | string | None | Default data type as fallback if no corresponding member data type is defined. Note that this must be a structure data type.
545+
identifier | string | Yes | Name of the member in the base (structure) data type that identified a (group) member.
546+
members | list | Yes | List of (group) member data types. Note that these must be a structure data types.

dtfabric/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# -*- coding: utf-8 -*-
22
"""Data type fabric."""
33

4-
__version__ = '20230519'
4+
__version__ = '20230520'

dtfabric/data_types.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,8 @@ class StructureGroupDefinition(LayoutDataTypeDefinition):
901901
902902
Attributes:
903903
base (DataTypeDefinition): base data type definition.
904+
byte_order (str): byte-order the data type.
905+
default (DataTypeDefinition): default data type definition.
904906
identifier (str): name of the base structure member to identify the group
905907
members.
906908
members (list[DataTypeDefinition]): member data type definitions.
@@ -911,7 +913,8 @@ class StructureGroupDefinition(LayoutDataTypeDefinition):
911913

912914
def __init__(
913915
self, name: 'str', base_definition: 'StructureDefinition',
914-
identifier: 'str', aliases: 'Optional[List[str]]' = None,
916+
identifier: 'str', default_definition: 'StructureDefinition',
917+
aliases: 'Optional[List[str]]' = None,
915918
description: 'Optional[str]' = None,
916919
urls: 'Optional[List[str]]' = None) -> 'None':
917920
"""Initializes a structure group data type definition.
@@ -921,6 +924,7 @@ def __init__(
921924
base_definition (StructureDefinition): base data type definition.
922925
identifier (str): name of the base structure member to identify the group
923926
members.
927+
default_definition (StructureDefinition): default data type definition.
924928
aliases (Optional[list[str]]): aliases.
925929
description (Optional[str]): description.
926930
urls (Optional[list[str]]): URLs.
@@ -930,6 +934,9 @@ def __init__(
930934
self._members_by_name: 'OrderedDict[str, DataTypeDefinition]' = (
931935
collections.OrderedDict())
932936
self.base: 'Union[DataTypeDefinition, None]' = base_definition
937+
self.byte_order: 'str' = getattr(
938+
base_definition, 'byte_order', definitions.BYTE_ORDER_NATIVE)
939+
self.default: 'Union[DataTypeDefinition, None]' = default_definition
933940
self.identifier: 'Union[str, None]' = identifier
934941

935942
@property

dtfabric/reader.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class DataTypeDefinitionsReader(object):
8787
'base', 'members']).union(_SUPPORTED_DEFINITION_VALUES_DATA_TYPE)
8888

8989
_SUPPORTED_DEFINITION_VALUES_STRUCTURE_GROUP = set([
90-
'base', 'identifier', 'members']).union(
90+
'base', 'default', 'identifier', 'members']).union(
9191
_SUPPORTED_DEFINITION_VALUES_DATA_TYPE)
9292

9393
_SUPPORTED_ATTRIBUTES_STORAGE_DATA_TYPE = set([
@@ -1145,13 +1145,24 @@ def _ReadStructureGroupDataTypeDefinition(
11451145
if not identifier:
11461146
raise errors.DefinitionReaderError(definition_name, 'missing identifier')
11471147

1148+
default = definition_values.get('default', None)
1149+
if not default:
1150+
default_data_type_definition = None
1151+
else:
1152+
default_data_type_definition = definitions_registry.GetDefinitionByName(
1153+
default)
1154+
if not default_data_type_definition:
1155+
raise errors.DefinitionReaderError(definition_name, (
1156+
f'undefined default: {default:s}'))
1157+
11481158
aliases = definition_values.get('aliases', None)
11491159
description = definition_values.get('description', None)
11501160
urls = definition_values.get('urls', None)
11511161

11521162
definition_object = data_types.StructureGroupDefinition(
11531163
definition_name, base_data_type_definition, identifier,
1154-
aliases=aliases, description=description, urls=urls)
1164+
default_data_type_definition, aliases=aliases, description=description,
1165+
urls=urls)
11551166

11561167
members = definition_values.get('members', None)
11571168
if not members:

dtfabric/runtime/data_maps.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -2209,10 +2209,16 @@ def __init__(self, data_type_definition):
22092209
FormatError: if the data type map cannot be determined from the data
22102210
type definition.
22112211
"""
2212+
default_data_type_map = None
2213+
if data_type_definition.default:
2214+
default_data_type_map = DataTypeMapFactory.CreateDataTypeMapByType(
2215+
data_type_definition.default)
2216+
22122217
super(StructureGroupMap, self).__init__(data_type_definition)
22132218
self._base_data_type_map = DataTypeMapFactory.CreateDataTypeMapByType(
22142219
data_type_definition.base)
22152220
self._data_type_maps = None
2221+
self._default_data_type_map = default_data_type_map
22162222

22172223
self._GetMemberDataTypeMaps(data_type_definition)
22182224

@@ -2344,7 +2350,8 @@ def MapByteStream(self, byte_stream, context=None, **kwargs):
23442350

23452351
context_state['member_identifier'] = member_identifier
23462352

2347-
member_data_type_map = self._data_type_maps.get(member_identifier, None)
2353+
member_data_type_map = self._data_type_maps.get(
2354+
member_identifier, self._default_data_type_map)
23482355
if member_data_type_map is None:
23492356
raise errors.MappingError(
23502357
f'Missing member data type map for '

tests/data_types.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,8 @@ def testInitialize(self):
535535
'base', description='my base structure type')
536536

537537
data_type_definition = data_types.StructureGroupDefinition(
538-
'group', base_definition, 'identifier', description='structure group')
538+
'group', base_definition, 'identifier', None,
539+
description='structure group')
539540
self.assertIsNotNone(data_type_definition)
540541

541542
def testAddMemberDefinition(self):
@@ -544,7 +545,8 @@ def testAddMemberDefinition(self):
544545
'base', description='my base structure type')
545546

546547
data_type_definition = data_types.StructureGroupDefinition(
547-
'group', base_definition, 'identifier', description='structure group')
548+
'group', base_definition, 'identifier', None,
549+
description='structure group')
548550
self.assertIsNotNone(data_type_definition)
549551

550552
group_member_definition = data_types.StructureDefinition(

0 commit comments

Comments
 (0)