Source code for dtfabric.registry

# -*- coding: utf-8 -*-
"""The data type definitions registry."""

import typing

from typing import Dict, List, Union  # pylint: disable=unused-import

from dtfabric import definitions

if typing.TYPE_CHECKING:
  from dtfabric import data_types


[docs]class DataTypeDefinitionsRegistry(object): """Data type definitions registry.""" def __init__(self) -> 'None': """Initializes a data type definitions registry.""" super(DataTypeDefinitionsRegistry, self).__init__() self._aliases: 'Dict[str, str]' = {} self._definitions: 'Dict[str, data_types.DataTypeDefinition]' = {} self._format_definitions: 'List[str]' = []
[docs] def DeregisterDefinition( self, data_type_definition: 'data_types.DataTypeDefinition') -> 'None': """Deregisters a data type definition. The data type definitions are identified based on their lower case name. Args: data_type_definition (DataTypeDefinition): data type definition. Raises: KeyError: if a data type definition is not set for the corresponding name. """ name = data_type_definition.name.lower() if name not in self._definitions: raise KeyError( f'Definition not set for name: {data_type_definition.name:s}.') del self._definitions[name]
[docs] def GetDefinitionByName( self, name: 'str') -> 'Union[data_types.DataTypeDefinition, None]': """Retrieves a specific data type definition by name. Args: name (str): name of the data type definition. Returns: DataTypeDefinition: data type definition or None if not available. """ lookup_name = name.lower() if lookup_name not in self._definitions: lookup_name = self._aliases.get(name, lookup_name) return self._definitions.get(lookup_name, None)
[docs] def GetDefinitions(self) -> 'List[data_types.DataTypeDefinition]': """Retrieves the data type definitions. Returns: list[DataTypeDefinition]: data type definitions. """ return list(self._definitions.values())
[docs] def RegisterDefinition( self, data_type_definition: 'data_types.DataTypeDefinition') -> 'None': """Registers a data type definition. The data type definitions are identified based on their lower case name. Args: data_type_definition (DataTypeDefinition): data type definitions. Raises: KeyError: if data type definition is already set for the corresponding name. """ name_lower = data_type_definition.name.lower() if name_lower in self._definitions: raise KeyError( f'Definition already set for name: {data_type_definition.name:s}.') if data_type_definition.name in self._aliases: raise KeyError( f'Alias already set for name: {data_type_definition.name:s}.') for alias in data_type_definition.aliases: if alias in self._aliases: raise KeyError(f'Alias already set for name: {alias:s}.') self._definitions[name_lower] = data_type_definition for alias in data_type_definition.aliases: self._aliases[alias] = name_lower if data_type_definition.TYPE_INDICATOR == definitions.TYPE_INDICATOR_FORMAT: self._format_definitions.append(name_lower)