in libraries/botbuilder-dialogs/botbuilder/dialogs/object_path.py [0:0]
def try_resolve_path(obj, property_path: str, evaluate: bool = False) -> []:
so_far = []
first = property_path[0] if property_path else " "
if first in ("'", '"'):
if not property_path.endswith(first):
return None
so_far.append(property_path[1 : len(property_path) - 2])
elif ObjectPath.is_int(property_path):
so_far.append(int(property_path))
else:
start = 0
i = 0
def emit():
nonlocal start, i
segment = property_path[start:i]
if segment:
so_far.append(segment)
start = i + 1
while i < len(property_path):
char = property_path[i]
if char in (".", "["):
emit()
if char == "[":
nesting = 1
i += 1
while i < len(property_path):
char = property_path[i]
if char == "[":
nesting += 1
elif char == "]":
nesting -= 1
if nesting == 0:
break
i += 1
if nesting > 0:
return None
expr = property_path[start:i]
start = i + 1
indexer = ObjectPath.try_resolve_path(obj, expr, True)
if not indexer:
return None
result = indexer[0]
if ObjectPath.is_int(result):
so_far.append(int(result))
else:
so_far.append(result)
i += 1
emit()
if evaluate:
result = ObjectPath.__resolve_segments(obj, so_far)
if not result:
return None
so_far.clear()
so_far.append(result)
return so_far