fix(s3-csv): clarify naming of CSV container concepts

Co-Authored-By: Ilya Averyanov <av@rubybox.dev>
This commit is contained in:
Andrew Mayorov 2024-04-29 14:41:42 +02:00
parent 83366cbed0
commit 4bea938ef2
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
1 changed files with 22 additions and 14 deletions

View File

@ -16,14 +16,22 @@
-record(csv, {
columns :: [binary()] | undefined,
order :: [binary()],
separator :: char() | iodata(),
delimiter :: char() | iodata(),
column_order :: [binary()],
%% A string or character that separates each field in a record from the next.
%% Default: ","
field_separator :: char() | iodata(),
%% A string or character that delimits boundaries of a record.
%% Default: "\n"
record_delimiter :: char() | iodata(),
quoting_mp :: _ReMP
}).
-type container() :: #csv{}.
-type options() :: #{column_order => [column()]}.
-type options() :: #{
%% Which columns have to be ordered first in the resulting CSV?
column_order => [column()]
}.
-type record() :: emqx_bridge_s3_aggregator:record().
-type column() :: binary().
@ -34,9 +42,9 @@
new(Opts) ->
{ok, MP} = re:compile("[\\[\\],\\r\\n\"]", [unicode]),
#csv{
order = maps:get(column_order, Opts, []),
separator = $,,
delimiter = $\n,
column_order = maps:get(column_order, Opts, []),
field_separator = $,,
record_delimiter = $\n,
quoting_mp = MP
}.
@ -56,28 +64,28 @@ close(#csv{}) ->
%%
mk_columns(Record, #csv{order = ColumnOrder}) ->
mk_columns(Record, #csv{column_order = ColumnOrder}) ->
Columns = [emqx_utils_conv:bin(C) || C <- lists:sort(maps:keys(Record))],
Unoredered = Columns -- ColumnOrder,
ColumnOrder ++ Unoredered.
-spec emit_header([column()], container()) -> iodata().
emit_header([C], #csv{delimiter = Delim}) ->
emit_header([C], #csv{record_delimiter = Delim}) ->
[C, Delim];
emit_header([C | Rest], CSV = #csv{separator = Sep}) ->
emit_header([C | Rest], CSV = #csv{field_separator = Sep}) ->
[C, Sep | emit_header(Rest, CSV)];
emit_header([], #csv{delimiter = Delim}) ->
emit_header([], #csv{record_delimiter = Delim}) ->
[Delim].
-spec emit_row(record(), container()) -> iodata().
emit_row(Record, CSV = #csv{columns = Columns}) ->
emit_row(Record, Columns, CSV).
emit_row(Record, [C], CSV = #csv{delimiter = Delim}) ->
emit_row(Record, [C], CSV = #csv{record_delimiter = Delim}) ->
[emit_cell(C, Record, CSV), Delim];
emit_row(Record, [C | Rest], CSV = #csv{separator = Sep}) ->
emit_row(Record, [C | Rest], CSV = #csv{field_separator = Sep}) ->
[emit_cell(C, Record, CSV), Sep | emit_row(Record, Rest, CSV)];
emit_row(#{}, [], #csv{delimiter = Delim}) ->
emit_row(#{}, [], #csv{record_delimiter = Delim}) ->
[Delim].
emit_cell(Column, Record, CSV) ->