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]