%%
%% 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-dev"},

  % 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_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}
  ]}
]}.
