From 9c0950187b8ba556820d083c61987b05076dda49 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Sat, 13 Mar 2021 20:18:47 +0800 Subject: [PATCH] =?UTF-8?q?ft:=20=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{misc => errLogger}/rumErrLoggerH.erl | 0 src/{misc => mgrKiller}/rumMgrKiller.erl | 0 src/{misc => utils}/rumConfig.erl | 0 src/utils/rumKvsToBeam.erl | 42 +++++++++++++++++++++++ src/{misc => utils}/rumMsg.erl | 0 src/{misc => utils}/rumTruncIo.erl | 0 6 files changed, 42 insertions(+) rename src/{misc => errLogger}/rumErrLoggerH.erl (100%) rename src/{misc => mgrKiller}/rumMgrKiller.erl (100%) rename src/{misc => utils}/rumConfig.erl (100%) create mode 100644 src/utils/rumKvsToBeam.erl rename src/{misc => utils}/rumMsg.erl (100%) rename src/{misc => utils}/rumTruncIo.erl (100%) diff --git a/src/misc/rumErrLoggerH.erl b/src/errLogger/rumErrLoggerH.erl similarity index 100% rename from src/misc/rumErrLoggerH.erl rename to src/errLogger/rumErrLoggerH.erl diff --git a/src/misc/rumMgrKiller.erl b/src/mgrKiller/rumMgrKiller.erl similarity index 100% rename from src/misc/rumMgrKiller.erl rename to src/mgrKiller/rumMgrKiller.erl diff --git a/src/misc/rumConfig.erl b/src/utils/rumConfig.erl similarity index 100% rename from src/misc/rumConfig.erl rename to src/utils/rumConfig.erl diff --git a/src/utils/rumKvsToBeam.erl b/src/utils/rumKvsToBeam.erl new file mode 100644 index 0000000..3e0d66b --- /dev/null +++ b/src/utils/rumKvsToBeam.erl @@ -0,0 +1,42 @@ +-module(rumKvsToBeam). + +-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([get/0]). + ExportList = [erl_syntax:arity_qualifier(erl_syntax:atom(get), erl_syntax:integer(1))], + Export = erl_syntax:attribute(erl_syntax:atom(export), [erl_syntax:list(ExportList)]), + %% get(K) -> V + Function = erl_syntax:function(erl_syntax:atom(get), 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]). diff --git a/src/misc/rumMsg.erl b/src/utils/rumMsg.erl similarity index 100% rename from src/misc/rumMsg.erl rename to src/utils/rumMsg.erl diff --git a/src/misc/rumTruncIo.erl b/src/utils/rumTruncIo.erl similarity index 100% rename from src/misc/rumTruncIo.erl rename to src/utils/rumTruncIo.erl