From 00622aaa2f0844920db2e34b08c96517dbdce41d Mon Sep 17 00:00:00 2001 From: ssmith Date: Sun, 14 May 2006 20:56:49 -0700 Subject: Add dict encoder and basic test. --- bencode.erl | 20 +++++++++++++++++++- tests.erl | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bencode.erl b/bencode.erl index a335ab9..96eb33f 100644 --- a/bencode.erl +++ b/bencode.erl @@ -7,6 +7,14 @@ %% %% %% %% %% %% %% %% Decoding %% %% %% %% %% %% %% %% +keyenc(Key) when is_list(Key) -> + bencode({string, Key}); +keyenc(Key) when is_atom(Key) -> + bencode({string, atom_to_list(Key)}); +keyenc({string, _} = Key) -> + bencode(Key). + + bencode({int, Val}) -> "i" ++ integer_to_list(Val) ++ "e"; @@ -15,7 +23,17 @@ bencode({string, Val}) -> bencode({list, Val}) -> Fun = fun(A) -> bencode(A) end, - "l" ++ lists:flatten(lists:map(Fun, Val)) ++ "e". + "l" ++ lists:flatten(lists:map(Fun, Val)) ++ "e"; + +bencode({dict, Dict}) -> + SFun = fun({Key1, _}, {Key2, _}) -> + Key1 < Key2 + end, + List = lists:sort(SFun, dict:to_list(Dict)), + MFun = fun({Key, Val}) -> + keyenc(Key) ++ bencode(Val) + end, + "d" ++ lists:flatten(lists:map(MFun, List)) ++ "e". %% %% %% %% %% %% %% %% Decoding %% %% %% %% %% %% %% %% diff --git a/tests.erl b/tests.erl index a12b663..ce891be 100644 --- a/tests.erl +++ b/tests.erl @@ -33,6 +33,11 @@ test_enc_list3() -> {int, 3}]}, {string, "xyz"}]})). +%% Dict encoding tests +test_enc_dict() -> + Dict = dict:from_list([{"age", {int, 25}}, {"eyes", {string, "blue"}}]), + ?match("d3:agei25e4:eyes4:bluee", bencode:bencode({dict, Dict})). + %% Integer decoding tests test_dec_int1() -> -- cgit v1.2.3