forked from mojombo/bert.erl
/
bert.erl
69 lines (55 loc) · 1.7 KB
/
bert.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
%%% See http://github.com/mojombo/bert.erl for documentation.
%%% MIT License - Copyright (c) 2009 Tom Preston-Werner <tom@mojombo.com>
-module(bert).
-version('1.1.0').
-author("Tom Preston-Werner").
-export([encode/1, decode/1]).
-ifdef(TEST).
-include("test/bert_test.erl").
-endif.
%%---------------------------------------------------------------------------
%% Public API
-spec encode(term()) -> binary().
encode(Term) ->
term_to_binary(encode_term(Term)).
-spec decode(binary()) -> term().
decode(Bin) ->
decode_term(binary_to_term(Bin)).
%%---------------------------------------------------------------------------
%% Encode
-spec encode_term(term()) -> term().
encode_term(Term) ->
case Term of
[] -> {bert, nil};
true -> {bert, true};
false -> {bert, false};
Dict when is_tuple(Term) andalso element(1, Term) =:= dict ->
{bert, dict, dict:to_list(Dict)};
List when is_list(Term) ->
lists:map((fun encode_term/1), List);
Tuple when is_tuple(Term) ->
TList = tuple_to_list(Tuple),
TList2 = lists:map((fun encode_term/1), TList),
list_to_tuple(TList2);
_Else -> Term
end.
%%---------------------------------------------------------------------------
%% Decode
-spec decode_term(term()) -> term().
decode_term(Term) ->
case Term of
{bert, nil} -> [];
{bert, true} -> true;
{bert, false} -> false;
{bert, dict, Dict} ->
dict:from_list(Dict);
{bert, Other} ->
{bert, Other};
List when is_list(Term) ->
lists:map((fun decode_term/1), List);
Tuple when is_tuple(Term) ->
TList = tuple_to_list(Tuple),
TList2 = lists:map((fun decode_term/1), TList),
list_to_tuple(TList2);
_Else -> Term
end.