def _parse_array()

in redshift_connector/utils/type_utils.py [0:0]


def _parse_array(adapter: typing.Optional[typing.Callable], data: bytes, offset: int, length: int) -> typing.List:
    state: ArrayState = ArrayState.Out
    stack: typing.List = [[]]
    val: typing.List[str] = []
    str_data: str = text_recv(data, offset, length)

    for c in str_data:
        if state == ArrayState.InValue:
            if c in ("}", ","):
                value: typing.Optional[str] = "".join(val)
                if value == "NULL":
                    value = None
                elif adapter is not None:
                    value = adapter(value)
                stack[-1].append(value)
                state = ArrayState.Out
            else:
                val.append(c)

        if state == ArrayState.Out:
            if c == "{":
                a: typing.List = []
                stack[-1].append(a)
                stack.append(a)
            elif c == "}":
                stack.pop()
            elif c == ",":
                pass
            elif c == '"':
                val = []
                state = ArrayState.InString
            else:
                val = [c]
                state = ArrayState.InValue

        elif state == ArrayState.InString:
            if c == '"':
                value = "".join(val)
                if adapter is not None:
                    value = adapter(value)  # type: ignore
                stack[-1].append(value)
                state = ArrayState.Out
            elif c == "\\":
                state = ArrayState.InEscape
            else:
                val.append(c)
        elif state == ArrayState.InEscape:
            val.append(c)
            state = ArrayState.InString

    return stack[0][0]