For fun, I made a version with parse_trans which generates a module:
-module(mapping).
-compile(export_all).
-include_lib("parse_trans/include/codegen.hrl").
-define(MAP, [
{hello, 100},
{help, 101},
{done, 102}
]).
codegen(Mod) ->
codegen:gen_module(
{'$var',Mod}, [{encode,1},
{decode,1}],
[{encode, [fun({'$var',X}) ->
{'$var', Y}
end || {X, Y} <- ?MAP]},
{decode, [fun({'$var', Y}) ->
{'$var', X}
end || {X, Y} <- ?MAP]}]).
Eshell V5.9.2 (abort with ^G)
1> c(mapping).
{ok,mapping}
2> mapping:codegen(x).
[{attribute,1,module,x},
{attribute,37,export,[{encode,1},{decode,1}]},
{function,39,encode,1,
[{clause,39,[{atom,39,hello}],[],[{integer,40,100}]},
{clause,39,[{atom,39,help}],[],[{integer,40,101}]},
{clause,39,[{atom,39,done}],[],[{integer,40,102}]}]},
{function,42,decode,1,
[{clause,42,[{integer,42,100}],[],[{atom,43,hello}]},
{clause,42,[{integer,42,101}],[],[{atom,43,help}]},
{clause,42,[{integer,42,102}],[],[{atom,43,done}]}]}]
3> compile:forms(v(2),[]).
{ok,x,
<<70,79,82,49,0,0,2,48,66,69,65,77,65,116,111,109,0,0,0,
71,0,0,0,9,1,120,...>>}
4> code:load_binary(x,"/tmp/x.beam",element(3,v(3))).
{module,x}
5> x:encode(hello).
100
6> x:decode(100).
hello
The codegen:gen_module/3 pseudo-function is documented here:
https://github.com/esl/parse_trans/blob/master/doc/parse_trans_codegen.md#gen_module3
BR,
Ulf W
Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.
http://feuerlabs.com