/elib/bert.erl

https://github.com/dergraf/ernie · Erlang · 69 lines · 47 code · 14 blank · 8 comment · 0 complexity · 1d711c26f40fba91a918fb36bf93bcf1 MD5 · raw file

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