blob: 73c179095d31235353d97c5eb982af9c06f846a1 [file] [log] [blame]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-module(couch_httpd_handlers).
-export([
url_handler/2,
db_handler/2,
design_handler/2,
select/4
]).
-include_lib("couch/include/couch_db.hrl").
%% ------------------------------------------------------------------
%% API Function Definitions
%% ------------------------------------------------------------------
url_handler(HandlerKey, Stack) ->
Stack:url_handler(HandlerKey).
db_handler(HandlerKey, Stack) ->
Stack:db_handler(HandlerKey).
design_handler(HandlerKey, Stack) ->
Stack:design_handler(HandlerKey).
select(ServiceID, Func, HandlerKey, Default) ->
select(collect(ServiceID, Func, [HandlerKey]), Default).
%% ------------------------------------------------------------------
%% Internal Function Definitions
%% ------------------------------------------------------------------
collect(ServiceID, Func, Args) ->
Results = do_apply(ServiceID, Func, Args, []),
[HandlerFun || HandlerFun <- Results, HandlerFun /= no_match].
do_apply(ServiceID, Func, Args, Opts) ->
Handle = couch_epi:get_handle(ServiceID),
couch_epi:apply(Handle, ServiceID, Func, Args, Opts).
select([], Default) ->
Default;
select([{default, OverrideDefault}], _Default) ->
OverrideDefault;
select(Handlers, _Default) ->
[Handler] = do_select(Handlers, []),
Handler.
do_select([], Acc) ->
Acc;
do_select([{override, Handler}|_], _Acc) ->
[Handler];
do_select([{default, _}|Rest], Acc) ->
do_select(Rest, Acc);
do_select([Handler], Acc) ->
[Handler | Acc];
do_select([Handler | Rest], Acc) ->
do_select(Rest, [Handler | Acc]).
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
select_override_test() ->
?assertEqual(selected, select([{override, selected}, foo], default)),
?assertEqual(selected, select([foo, {override, selected}], default)),
?assertEqual(selected, select([{override, selected}, {override, bar}], default)),
?assertError({badmatch,[bar, foo]}, select([foo, bar], default)).
select_default_override_test() ->
?assertEqual(selected, select([{default, new_default}, selected], old_default)),
?assertEqual(selected, select([selected, {default, new_default}], old_default)),
?assertEqual(selected, select([{default, selected}], old_default)),
?assertEqual(selected, select([], selected)),
?assertEqual(selected,
select([{default, new_default}, {override, selected}, bar], old_default)).
-endif.