%%
%% Licensed to the Apache Software Foundation (ASF) under one
%% or more contributor license agreements. See the NOTICE file
%% distributed with this work for additional information
%% regarding copyright ownership. The ASF licenses this file
%% to you 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.
%%
%%% -*- mode:erlang -*-
{application, thrift, [
  % A quick description of the application.
  {description, "Thrift bindings"},

  % The version of the applicaton
  {vsn, "1.0.0"},

  % All modules used by the application.
  {modules, [
    thrift_base64_transport,
    thrift_binary_protocol,
    thrift_buffered_transport,
    thrift_client_util,
    thrift_client,
    thrift_disk_log_transport,
    thrift_file_transport,
    thrift_framed_transport,
    thrift_http_transport,
    thrift_json_parser,
    thrift_json_protocol,
    thrift_membuffer_transport,
    thrift_memory_buffer,
    thrift_processor,
    thrift_protocol,
    thrift_reconnecting_client,
    thrift_server,
    thrift_service,
    thrift_socket_server,
    thrift_socket_transport,
    thrift_transport_state_test,
    thrift_transport
  ]},

  % All of the registered names the application uses. This can be ignored.
  {registered, []},

  % Applications that are to be started prior to this one. This can be ignored
  % leave it alone unless you understand it well and let the .rel files in
  % your release handle this.
  {applications, [kernel, stdlib]},

  % OTP application loader will load, but not start, included apps. Again
  % this can be ignored as well.  To load but not start an application it
  % is easier to include it in the .rel file followed by the atom 'none'
  {included_applications, []},

  % configuration parameters similar to those in the config file specified
  % on the command line. can be fetched with gas:get_env
  {env, [
    % If an error/crash occurs during processing of a function,
    % should the TApplicationException serialized back to the client
    % include the erlang backtrace?
    {exceptions_include_traces, true}
  ]}
]}.
