| %%% Copyright (c) 2007- Facebook | 
 | %%% Distributed under the Thrift Software License | 
 | %%% | 
 | %%% See accompanying file LICENSE or visit the Thrift site at: | 
 | %%% http://developers.facebook.com/thrift/ | 
 |  | 
 | -module(thrift). | 
 |  | 
 | -export([start/0, stop/0, config/1, config/2]). | 
 |  | 
 | -include("thrift.hrl"). | 
 |  | 
 | %%% | 
 | %%% behavior definition | 
 | %%% | 
 |  | 
 | start() -> | 
 |     application:start(thrift). | 
 |  | 
 | stop() -> | 
 |     application:stop(thrift). | 
 |  | 
 | %%% | 
 | %%% configuration | 
 | %%% | 
 |  | 
 | %% go to the global file by default | 
 | config(Path) -> | 
 |     config(Path, {file, ?CONFIG_FILE}). | 
 |  | 
 | config(Path, Source) -> | 
 |     case config1(Path, Source) of | 
 | 	{error, file_error, R} -> | 
 | 	    ?ERROR("error opening config ~p: ~p", [Source, R]), | 
 | 	    false; | 
 | 	{error, bad_item, Tuple} -> | 
 | 	    ?ERROR("malformed config item ~p found at ~p in ~p", [Tuple, Path, Source]), | 
 | 	    false; | 
 | 	{error, not_found} -> | 
 | 	    ?ERROR("config item ~p not found in ~p", [Path, Source]), | 
 | 	    false; | 
 | 	{value, V} -> | 
 | 	    {value, V} | 
 |     end. | 
 |  | 
 | %% go to a file | 
 | config1(Path, {file, File}) -> | 
 |     case file:consult(File) of | 
 | 	{error, R={_,_,_}} -> | 
 | 	    {error, file_error, file:format_error(R)}; | 
 | 	{error, Posix} -> | 
 | 	    {error, file_error, Posix}; | 
 | 	{ok, List} when is_list(List) -> | 
 | 	    config1(Path, List) | 
 |     end; | 
 |  | 
 | %% go through a list from a file or a sublist | 
 | config1([P|Ps], List) when is_list(List) -> | 
 |     case lists:keysearch(P, 1, List) of | 
 | 	{value, Tuple} when size(Tuple) == 2 -> | 
 | 	    List1 = element(2, Tuple), %% either another list or, if Ps is [], the item itself | 
 | 	    config1(Ps, List1); | 
 | 	{value, Tuple} -> | 
 | 	    {error, bad_item, Tuple}; | 
 | 	false -> | 
 | 	    {error, not_found} | 
 |     end; | 
 | config1([], Item)     -> {value, Item}; | 
 | config1(Item, Source) -> config1([Item], Source). |