From 4bea938ef25150370459262d1204f30d7039f6de Mon Sep 17 00:00:00 2001 From: Andrew Mayorov Date: Mon, 29 Apr 2024 14:41:42 +0200 Subject: [PATCH] fix(s3-csv): clarify naming of CSV container concepts Co-Authored-By: Ilya Averyanov --- .../src/emqx_bridge_s3_aggreg_csv.erl | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/apps/emqx_bridge_s3/src/emqx_bridge_s3_aggreg_csv.erl b/apps/emqx_bridge_s3/src/emqx_bridge_s3_aggreg_csv.erl index 96d924912..33895d8c1 100644 --- a/apps/emqx_bridge_s3/src/emqx_bridge_s3_aggreg_csv.erl +++ b/apps/emqx_bridge_s3/src/emqx_bridge_s3_aggreg_csv.erl @@ -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) ->