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, { -record(csv, {
columns :: [binary()] | undefined, columns :: [binary()] | undefined,
order :: [binary()], column_order :: [binary()],
separator :: char() | iodata(), %% A string or character that separates each field in a record from the next.
delimiter :: char() | iodata(), %% Default: ","
field_separator :: char() | iodata(),
%% A string or character that delimits boundaries of a record.
%% Default: "\n"
record_delimiter :: char() | iodata(),
quoting_mp :: _ReMP quoting_mp :: _ReMP
}). }).
-type container() :: #csv{}. -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 record() :: emqx_bridge_s3_aggregator:record().
-type column() :: binary(). -type column() :: binary().
@ -34,9 +42,9 @@
new(Opts) -> new(Opts) ->
{ok, MP} = re:compile("[\\[\\],\\r\\n\"]", [unicode]), {ok, MP} = re:compile("[\\[\\],\\r\\n\"]", [unicode]),
#csv{ #csv{
order = maps:get(column_order, Opts, []), column_order = maps:get(column_order, Opts, []),
separator = $,, field_separator = $,,
delimiter = $\n, record_delimiter = $\n,
quoting_mp = MP 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))], Columns = [emqx_utils_conv:bin(C) || C <- lists:sort(maps:keys(Record))],
Unoredered = Columns -- ColumnOrder, Unoredered = Columns -- ColumnOrder,
ColumnOrder ++ Unoredered. ColumnOrder ++ Unoredered.
-spec emit_header([column()], container()) -> iodata(). -spec emit_header([column()], container()) -> iodata().
emit_header([C], #csv{delimiter = Delim}) -> emit_header([C], #csv{record_delimiter = Delim}) ->
[C, 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)]; [C, Sep | emit_header(Rest, CSV)];
emit_header([], #csv{delimiter = Delim}) -> emit_header([], #csv{record_delimiter = Delim}) ->
[Delim]. [Delim].
-spec emit_row(record(), container()) -> iodata(). -spec emit_row(record(), container()) -> iodata().
emit_row(Record, CSV = #csv{columns = Columns}) -> emit_row(Record, CSV = #csv{columns = Columns}) ->
emit_row(Record, Columns, CSV). 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_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_cell(C, Record, CSV), Sep | emit_row(Record, Rest, CSV)];
emit_row(#{}, [], #csv{delimiter = Delim}) -> emit_row(#{}, [], #csv{record_delimiter = Delim}) ->
[Delim]. [Delim].
emit_cell(Column, Record, CSV) -> emit_cell(Column, Record, CSV) ->