% 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.

CouchConfig = case filelib:is_file(os:getenv("COUCHDB_CONFIG")) of
    true ->
        {ok, Result} = file:consult(os:getenv("COUCHDB_CONFIG")),
        Result;
    false ->
        []
end.

Backend = case lists:keyfind(couch_log_backend, 1, CouchConfig) of
    {couch_log_backend, Backend0} ->
        Backend0;
    false ->
        couch_log_stderr
end.

BackendApps = case lists:keyfind(couch_log_backend_apps, 1, CouchConfig) of
    {couch_log_backend_apps, {list, Apps}} ->
        Apps;
    false ->
        []
end.

{application, couch_log, [
    {description, "CouchDB Log API"},
    {vsn, git},
    {modules, [couch_log]},
    {registered, []},
    {applications, [kernel, stdlib] ++ BackendApps},
    {env, [{backend, Backend}]}
]}.
