|
-module(utKvsToBeam).
|
|
|
|
-export([
|
|
load/2
|
|
]).
|
|
|
|
%% 注意 map类型的数据不能当做key
|
|
-type key() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple().
|
|
-type value() :: atom() | binary() | bitstring() | float() | integer() | list() | tuple() | map().
|
|
|
|
-spec load(term(), [{key(), value()}]) -> ok.
|
|
load(Module, KVs) ->
|
|
Forms = forms(Module, KVs),
|
|
{ok, Module, Bin} = compile:forms(Forms),
|
|
code:soft_purge(Module),
|
|
{module, Module} = code:load_binary(Module, atom_to_list(Module), Bin),
|
|
ok.
|
|
|
|
forms(Module, KVs) ->
|
|
%% -module(Module).
|
|
Mod = erl_syntax:attribute(erl_syntax:atom(module), [erl_syntax:atom(Module)]),
|
|
%% -export([getV/0]).
|
|
ExportList = [erl_syntax:arity_qualifier(erl_syntax:atom(getV), erl_syntax:integer(1))],
|
|
Export = erl_syntax:attribute(erl_syntax:atom(export), [erl_syntax:list(ExportList)]),
|
|
%% getV(K) -> V
|
|
Function = erl_syntax:function(erl_syntax:atom(getV), lookup_clauses(KVs, [])),
|
|
[erl_syntax:revert(X) || X <- [Mod, Export, Function]].
|
|
|
|
lookup_clause(Key, Value) ->
|
|
Var = erl_syntax:abstract(Key),
|
|
Body = erl_syntax:abstract(Value),
|
|
erl_syntax:clause([Var], [], [Body]).
|
|
|
|
lookup_clause_anon() ->
|
|
Var = erl_syntax:variable("_"),
|
|
Body = erl_syntax:atom(undefined),
|
|
erl_syntax:clause([Var], [], [Body]).
|
|
|
|
lookup_clauses([], Acc) ->
|
|
lists:reverse(lists:flatten([lookup_clause_anon() | Acc]));
|
|
lookup_clauses([{Key, Value} | T], Acc) ->
|
|
lookup_clauses(T, [lookup_clause(Key, Value) | Acc]).
|