Current section

Files

Jump to
tdata src tdata_loader.erl
Raw

src/tdata_loader.erl

-module(tdata_loader).
%% API
-export([
ensure_ets/0,
init_excel_loader/1,
set_loader/2,
get_loader/1,
load_input_files/3
]).
%%====================================================================
%% API functions
%%====================================================================
ensure_ets() ->
case ets:info(?MODULE, size) of
undefined ->
ets:new(?MODULE, [named_table, public, set]);
_ -> ?MODULE
end.
init_excel_loader(PythonPid) ->
ExcelLoader =
fun(ExcelFile, LoadSheetsOpts) ->
tdata_excel_loader:load_sheets(PythonPid, ExcelFile, LoadSheetsOpts)
end,
set_loader("default", ExcelLoader),
set_loader(".xls", ExcelLoader),
set_loader(".xlsx", ExcelLoader),
ok.
set_loader(Ext, Loader) when is_list(Ext) andalso is_function(Loader, 2) ->
ets:insert(?MODULE, {Ext, Loader}).
get_loader(Ext) when is_list(Ext) ->
case ets:lookup(?MODULE, Ext) of
[{_, Loader}] -> Loader;
_ -> undefined
end.
load_input_files({InputFile, LoadSheetsOpts}, InputDir, Acc) ->
Res = load_input_file(InputFile, LoadSheetsOpts, InputDir),
[Res | Acc];
load_input_files([{InputFile, LoadSheetsOpts} | InputFiles], InputDir, Acc) ->
Res = load_input_file(InputFile, LoadSheetsOpts, InputDir),
load_input_files(InputFiles, InputDir, [Res | Acc]);
load_input_files([], _InputDir, Acc) -> Acc.
%%====================================================================
%% Internal functions
%%====================================================================
load_input_file(InputFile0, LoadSheetsOpts, InputDir) ->
InputFile = filename:join(InputDir, InputFile0),
Ext = filename:extension(InputFile),
Loader =
case get_loader(Ext) of
undefined -> get_loader("default");
Loader0 -> Loader0
end,
case Loader(InputFile, LoadSheetsOpts) of
{ok, SheetsData} ->
{InputFile0, SheetsData};
Err ->
error({load_error, {InputFile0, Err}})
end.