in rostran/core/properties.py [0:0]
def resolve(self) -> "Properties":
props = Properties()
for old_name, old_prop in self.items():
name_parts = old_name.split(".")
if len(name_parts) == 1:
props[old_name] = Property(old_prop.name, old_prop.value)
continue
prop_name = None
cur_value = prop_value = None
length = len(name_parts)
for i, name_part in enumerate(name_parts):
result = NORMAL_PATTERN.findall(name_part)
if result:
cur_name = name_part
if i == 0:
prop_name = name_part
cur_value = prop_value = (
props[prop_name].value if prop_name in props else {}
)
elif i < length - 1:
if not isinstance(cur_value, dict):
raise ConflictDataTypeInExpression(expression=old_name)
if cur_name not in cur_value:
cur_value[cur_name] = {}
cur_value = cur_value[cur_name]
else:
if not isinstance(cur_value, dict):
raise ConflictDataTypeInExpression(expression=old_name)
cur_value[cur_name] = old_prop.value
continue
result = LIST_PATTERN.findall(name_part)
if result:
cur_name = result[0][0]
if i == 0:
prop_name = cur_name
cur_value = prop_value = (
props[prop_name].value if prop_name in props else []
)
cur_value = _handle_list_value(
name_part, cur_value, expression=old_name
)
elif i < length - 1:
if not isinstance(cur_value, dict):
raise ConflictDataTypeInExpression(expression=old_name)
if cur_name not in cur_value:
cur_value[cur_name] = []
cur_value = cur_value[cur_name]
cur_value = _handle_list_value(
name_part, cur_value, expression=old_name
)
else:
if not isinstance(cur_value, dict):
raise ConflictDataTypeInExpression(expression=old_name)
if cur_name not in cur_value:
cur_value[cur_name] = []
cur_value = cur_value[cur_name]
cur_value = _handle_list_value(
name_part,
cur_value,
expression=old_name,
data=old_prop.value,
)
continue
raise InvalidExpression(expression=old_name)
props[prop_name] = Property(prop_name, prop_value)
return props