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