""" Helper functions for the Snowflake connector client. """ from csv import DictWriter, QUOTE_ALL from io import StringIO from typing import Sequence, Iterable import msgpack from ...typings import ColName def _zip_cols_rows(col_names: Sequence[str], data: list[tuple]) -> Iterable[dict]: """Zip column names and data rows into a generator of dictionaries.""" return (dict(zip(col_names, row)) for row in data) def data_to_json(col_names: Sequence[str], data: list[tuple]) -> list[dict]: """ Convert a list of tuples into a list of dictionaries (JSON). Args: col_names: Column names. data: Rows of data as tuples. Returns: A list of dictionaries representing each row. """ return list(_zip_cols_rows(col_names, data)) def data_to_csv_string(col_names: Sequence[ColName], data: list[tuple]) -> str: """Convert a list of tuples into a CSV string. Args: col_names: Column names. data: Data to convert to CSV. Returns: CSV string with the data, including the header and with all fields quoted. """ buffer = StringIO() csv_writer = DictWriter( buffer, fieldnames=col_names, quoting=QUOTE_ALL, lineterminator="\n" ) csv_writer.writeheader() csv_writer.writerows(_zip_cols_rows(col_names, data)) return buffer.getvalue() def data_to_msgpack(col_names: Sequence[ColName], data: list[tuple]) -> bytes: """Convert a list of tuples into a msgpack binary string. Args: col_names: Column names. data: Data to convert to msgpack. Returns: Msgpack binary string with the data. """ return msgpack.packb(data_to_json(col_names, data))