def METHOD_NAME(self,
                       parent: str,
                       column: Dict[str, str],
                       cols: List[ColumnMetadata],
                       total_cols: int) -> int:
    get_column_type: Callable[[dict], str] = lambda column: column['type'] + ':' + column['mode']\
        if column.get('mode') else column['type']
    if len(parent) > 0:
        col_name = f'{parent}.{column["name"]}'
    else:
        col_name = column['name']
    if column['type'] == 'RECORD':
        col = ColumnMetadata(
            name=col_name,
            description=column.get('description', None),
            col_type=get_column_type(column),
            sort_order=total_cols)
        cols.append(col)
        total_cols += 1
        for field in column['fields']:
            # TODO field is actually a TableFieldSchema, per
            # https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#TableFieldSchema
            # however it's typed as str, which is incorrect. Work-around by casting.
            field_casted = cast(Dict[str, str], field)
            total_cols = self.METHOD_NAME(col_name, field_casted, cols, total_cols)
        return total_cols
    else:
        col = ColumnMetadata(
            name=col_name,
            description=column.get('description', None),
            col_type=get_column_type(column),
            sort_order=total_cols)
        cols.append(col)
        return total_cols + 1