fix(s3-csv): clarify naming of CSV container concepts
Co-Authored-By: Ilya Averyanov <av@rubybox.dev>
This commit is contained in:
parent
83366cbed0
commit
4bea938ef2
|
@ -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) ->
|
||||||
|
|
Loading…
Reference in New Issue