-module(findf_server).
-behaviour(gen_server).
-include("../include/findf.hrl").
-include("../include/findf_types.hrl").
-include("./findf_names.hrl").
-export([start_link/0, start_link/1, start/0, start/1]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
code_change/3]).
start_link() -> start_link(no_arg).
start_link(InitState) -> gen_server:start_link({local, ?SERVER}, ?MODULE, InitState, []).
start() -> start(no_arg).
start(InitState) -> gen_server:start({local, ?SERVER}, ?MODULE, InitState, []).
init(no_arg) -> init(#state{});
init(InitState) ->
if not is_record(InitState, state) -> {stop, badarg};
true ->
State = #state{dirs =
InitState#state.dirs ++
findf_util:get_list_from_arg(?APP_NAME, ?DIRS_KEY) ++
findf_util:get_list_from_env(?DIRS_ENV),
exts =
InitState#state.exts ++
findf_util:get_list_from_arg(?APP_NAME, ?EXTS_KEY) ++
findf_util:get_list_from_env(?EXTS_ENV)},
{ok, State}
end.
handle_call(get_dirs, _From, State) -> Reply = State#state.dirs, {reply, Reply, State};
handle_call({set_dirs, Dirs}, _From, State) ->
NewState = #state{dirs = Dirs, exts = State#state.exts},
Reply = ok,
{reply, Reply, NewState};
handle_call({add_to_dirs, Dir}, _From, State) ->
NewState = #state{dirs = findf_util:add_to_list(Dir, State#state.dirs),
exts = State#state.exts},
Reply = ok,
{reply, Reply, NewState};
handle_call({remove_from_dirs, Dir}, _From, State) ->
NewState = #state{dirs = findf_util:remove_from_list(Dir, State#state.dirs),
exts = State#state.exts},
Reply = ok,
{reply, Reply, NewState};
handle_call(get_exts, _From, State) -> Reply = State#state.exts, {reply, Reply, State};
handle_call({set_exts, Exts}, _From, State) ->
NewState = #state{exts = Exts, dirs = State#state.dirs},
Reply = ok,
{reply, Reply, NewState};
handle_call({add_to_exts, Ext}, _From, State) ->
NewState = #state{exts = findf_util:add_to_list(Ext, State#state.exts),
dirs = State#state.dirs},
Reply = ok,
{reply, Reply, NewState};
handle_call({remove_from_exts, Ext}, _From, State) ->
NewState = #state{exts = findf_util:remove_from_list(Ext, State#state.exts),
dirs = State#state.dirs},
Reply = ok,
{reply, Reply, NewState};
handle_call({find_file, Name}, _From, State) ->
Reply = try
{ok, findf_lib:find_file(Name, State#state.dirs, State#state.exts)}
catch
Reason -> {error, Reason}
end,
{reply, Reply, State};
handle_call({open_file, Name}, _From, State) ->
Reply = try
{ok, findf_lib:open_file(Name, State#state.dirs, State#state.exts)}
catch
Reason -> {error, Reason}
end,
{reply, Reply, State};
handle_call({read_file, Name}, _From, State) ->
Reply = try
{ok, findf_lib:read_file(Name, State#state.dirs, State#state.exts)}
catch
Reason -> {error, Reason}
end,
{reply, Reply, State}.
handle_cast(stop, State) -> {stop, normal, State};
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.