def convert(node, input_type): """Convert value of Scalar node to expected type. node: :py:class:`DataNode` data structure input_type: definition of input_type """ conversions = { 'Bool': ScalarConverter._convert_to_bool, 'Integer': ScalarConverter._convert_to_int, 'Double': ScalarConverter._convert_to_float, 'String': ScalarConverter._convert_to_string, 'FileName': ScalarConverter._convert_to_string, 'Selection': ScalarConverter._convert_to_string, } base_type = input_type['base_type'] if base_type in conversions and node.value is not None: try: value = conversions[base_type](node.value) except ValueError: notification = Notification.from_name('ValueConversionError', node.value, base_type) notification.span = node.span notification_handler.report(notification) return node.value = value
def make_transposition(cls, node, input_type): """Transpose a record or scalar into an array.""" assert input_type['base_type'] == 'Array', "Only Array can be a result of transposition" cls.init() # if node is scalar, convert it to array if node.implementation == DataNode.Implementation.scalar: return cls._expand_value_to_array(node) # verify that subtype is record subtype = input_type['subtype'] if subtype['base_type'] != 'Record': notification = Notification.from_name('UnsupportedTransposition', input_type['base_type']) notification.span = node.span notification_handler.report(notification) return node assert node.implementation == DataNode.Implementation.mapping,\ "Can not perform transposition on array" # get array size try: cls._get_transformation_array_size(node, subtype) except Notification as notification: notification_handler.report(notification) return node if cls.array_size is None: cls.array_size = 1 # create array array_node = SequenceDataNode(node.key, node.parent) array_node.span = node.span array_node.input_type = node.input_type array_node.origin = DataNode.Origin.ac_array template_node = deepcopy(node) template_node.parent = array_node template_node.input_type = subtype template_node.origin = DataNode.Origin.ac_transposition # create and transpose items of the array for i in range(cls.array_size): child_node = deepcopy(template_node) child_node.key = TextValue(str(i)) # convert array to value for path in cls.paths_to_convert: node_to_convert = child_node.get_node_at_path(path) converted_node = node_to_convert.children[i] converted_node.parent = node_to_convert.parent converted_node.key = node_to_convert.key node_to_convert.parent.set_child(converted_node) array_node.children.append(child_node) return array_node