def try_resolve_path()

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