Current section
Files
Jump to
Current section
Files
src/qdate_srv.erl
% vim: ts=4 sw=4 et
% Copyright (c) 2013-2015 Jesse Gumm
% See LICENSE for licensing information.
%
% NOTE: You'll probably notice that this isn't *actually* a server. It *used*
% to be a server, but is now instead just where we interact with the qdate
% application environment. Anyway, sorry for the confusion.
-module(qdate_srv).
-export([
set_timezone/1,
set_timezone/2,
get_timezone/0,
get_timezone/1,
clear_timezone/0,
clear_timezone/1,
register_parser/1,
register_parser/2,
get_parsers/0,
deregister_parsers/0,
deregister_parser/1,
register_format/2,
get_format/1,
deregister_format/1,
get_formats/0
]).
%% Simple wrappers for unique keys
-define(BASETAG, qdate_var).
-define(KEY(Name), {?BASETAG, Name}).
-define(TZTAG, qdate_tz).
-define(TZKEY(Name), {?TZTAG, Name}).
-define(PARSERTAG, qdate_parser).
-define(PARSERKEY(Name), {?PARSERTAG, Name}).
-define(FORMATTAG, qdate_format).
-define(FORMATKEY(Name), {?FORMATTAG, Name}).
%% PUBLIC API FUNCTIONS
set_timezone(TZ) ->
put_pd(?TZTAG, TZ).
set_timezone(Key, TZ) ->
set_env(?TZKEY(Key), TZ).
get_timezone() ->
get_pd(?TZTAG).
get_timezone(Key) ->
get_env(?TZKEY(Key)).
clear_timezone() ->
unset_pd(?TZTAG).
clear_timezone(Key) ->
unset_env(?TZKEY(Key)).
register_parser(Parser) when is_function(Parser,1) ->
register_parser(erlang:make_ref(),Parser).
register_parser(Key,Parser) when is_function(Parser,1) ->
set_env(?PARSERKEY(Key), Parser).
deregister_parser(Key) ->
unset_env(?PARSERKEY(Key)).
deregister_parsers() ->
[deregister_parser(Key) || {Key, _} <- get_parsers()].
get_parsers() ->
get_all_env(?PARSERTAG).
register_format(Key, Format) ->
set_env(?FORMATKEY(Key), Format).
get_format(Key) ->
get_env(?FORMATKEY(Key)).
deregister_format(Key) ->
unset_env(?FORMATKEY(Key)).
get_formats() ->
get_all_env(?FORMATTAG).
%% PRIVATE TOOLS
%% App Vars
set_env(Key, Val) ->
application:set_env(qdate, ?KEY(Key), Val).
get_env(Key) ->
get_env(Key, undefined).
get_env(Key, Default) ->
%% Soon, this can just be replaced with application:get_env/3
%% which was introduced in R16B.
case application:get_env(qdate, ?KEY(Key)) of
undefined -> Default;
{ok, Val} -> Val
end.
unset_env(Key) ->
application:unset_env(qdate, ?KEY(Key)).
get_all_env(FilterTag) ->
All = application:get_all_env(qdate),
%% Maybe this is a little nasty.
[{Key, V} || {{?BASETAG, {Tag, Key}}, V} <- All, Tag==FilterTag].
%% ProcDic Vars
get_pd(Key) ->
erlang:get(?KEY(Key)).
put_pd(Key, Val) ->
erlang:put(?KEY(Key), Val),
ok.
unset_pd(Key) ->
put_pd(Key, undefined).