iot/apps/iot/src/iot_env.erl
2024-08-30 15:04:30 +08:00

61 lines
1.6 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @author anlicheng
%%% @copyright (C) 2024, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 30. 8月 2024 10:44
%%%-------------------------------------------------------------------
-module(iot_env).
-author("anlicheng").
%% 定义变量
-record(env, {
key,
val
}).
%% API
-export([new/0, reload/0, get_value/1, get_value/2]).
-spec new() -> ok.
new() ->
ets:new(iot_env, [public, set, named_table, {read_concurrency, true}, {keypos, 2}]),
Envs = load_env(),
lager:debug("[iot_env] load envs: ~p", [Envs]),
[ets:insert(iot_env, #env{key = Key, val = Val}) || {Key, Val} <- Envs],
ok.
-spec reload() -> ok.
reload() ->
Envs = load_env(),
lager:debug("[iot_env] load envs: ~p", [Envs]),
[ets:insert(iot_env, #env{key = Key, val = Val}) || {Key, Val} <- Envs],
ok.
-spec get_value(Key :: atom()) -> any().
get_value(Key) when is_atom(Key) ->
get_value(Key, undefined).
-spec get_value(Key :: atom(), Default :: any()) -> any().
get_value(Key, Default) when is_atom(Key) ->
case ets:lookup(iot_env, Key) of
[] ->
Default;
[#env{val = Val}|_] ->
Val
end.
-spec load_env() -> [binary()].
load_env() ->
Dir = code:priv_dir(iot),
EnvFile = Dir ++ "/env.config",
case file:read_file(EnvFile) of
{ok, Content} ->
{ok, Tokens, _} = erl_scan:string(binary_to_list(Content)),
{ok, Forms} = erl_parse:parse_term(Tokens),
Forms;
{error, Reason} ->
lager:warning("[iot] read .env file: ~p, get error: ~p", [EnvFile, Reason]),
[]
end.