diff --git a/lib/transcoder.ex b/lib/transcoder.ex index 0359a47..2efd36b 100644 --- a/lib/transcoder.ex +++ b/lib/transcoder.ex @@ -1,31 +1,49 @@ defmodule Couchie.Transcoder do - require Bitwise + use Bitwise - @cbe_json 0x02 - @cbe_raw 0x04 - @cbe_str 0x08 + @json_flag 0x2 + @raw_flag 0x4 + @str_flag 0x8 - #API defined by cberl_transcoder.erl - #Currently: Ignore flags, everything goes thru jazz - def encode_value(flags, value) do - JSON.encode!(value) - end + ## Encoder - def decode_value(flags, value) do - JSON.decode!(value, keys: :atoms) - end + def encode_value(encoders, value), + do: do_encode_value(flag(encoders), value) + + def do_encode_value(flag, value) when (flag &&& @json_flag) === @json_flag, + do: do_encode_value(flag ^^^ @json_flag, JSON.encode!(value)) + + def do_encode_value(flag, value) when (flag &&& @raw_flag) === @raw_flag, + do: do_encode_value(flag ^^^ @raw_flag, :erlang.term_to_binary(value)) + + def do_encode_value(flag, value) when (flag &&& @str_flag) === @str_flag and is_binary(value), + do: do_encode_value(flag ^^^ @str_flag, value) + + def do_encode_value(_, value), do: value + + ## Decoder + + def decode_value(flag, value) when (flag &&& @json_flag) === @json_flag, + do: decode_value(flag ^^^ @json_flag, JSON.decode!(value, keys: :atoms)) + + def decode_value(flag, value) when (flag &&& @raw_flag) === @raw_flag, + do: decode_value(flag ^^^ @raw_flag, :erlang.binary_to_term(value)) + + def decode_value(flag, value) when (flag &&& @str_flag) === @str_flag, + do: decode_value(flag ^^^ @str_flag, value) + + def decode_value(_, value), do: value def flag(encoders) when is_list(encoders) do - List.foldr(encoders, 0, fn (x, acc) -> Bitwise.bor(acc, x) end) + List.foldr(encoders, 0, &Bitwise.bor(&2, &1)) end def flag(encoder) do case encoder do - :standard -> @cbe_json - :json -> @cbe_json - :raw_binary -> @cbe_raw - :str -> @cbe_str + :standard -> @json_flag + :json -> @json_flag + :raw_binary -> @raw_flag + :str -> @str_flag end end - end