%%
%% 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, "0.12.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}
  ]}
]}.
