this repo has no description
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add binary support to structure encoding

garrison f612fc7f 95297c8b

+35
+15
lib/encoding/structure.ex
··· 3 3 4 4 @escape 0xFF 5 5 @nil_value 0x00 6 + @binary 0x01 6 7 7 8 @int_neg_8 0x0C 8 9 @int_neg_7 0x0D ··· 69 70 defp encode_field(nil), do: {<<@nil_value>>, ""} 70 71 defp encode_field(false), do: {<<@bool_false>>, ""} 71 72 defp encode_field(true), do: {<<@bool_true>>, ""} 73 + 74 + defp encode_field(binary) when is_binary(binary) do 75 + size = byte_size(binary) 76 + assert size < (2 ** 32) 77 + 78 + {<<@binary, size::integer-32>>, binary} 79 + end 72 80 73 81 defp encode_field(int) when is_integer(int) and int < 0 do 74 82 binary = :binary.encode_unsigned(-int) ··· 120 128 defp decode_size(@bool_false, bin), do: {0, bin} 121 129 defp decode_size(@bool_true, bin), do: {0, bin} 122 130 131 + defp decode_size(@binary, <<size::integer-32, rest::binary>>), do: {size, rest} 132 + 123 133 defp decode_size(@int_neg_8, bin), do: {8, bin} 124 134 defp decode_size(@int_neg_7, bin), do: {7, bin} 125 135 defp decode_size(@int_neg_6, bin), do: {6, bin} ··· 152 162 defp decode_value(@nil_value, _pos, _size, _data), do: nil 153 163 defp decode_value(@bool_false, _pos, _size, _data), do: false 154 164 defp decode_value(@bool_true, _pos, _size, _data), do: true 165 + 166 + defp decode_value(@binary, pos, size, data) do 167 + <<_prefix::binary-size(pos), value::binary-size(size), _rest::binary>> = data 168 + value 169 + end 155 170 156 171 defp decode_value(int_type, pos, size, data) when int_type in @neg_int_types do 157 172 <<_prefix::binary-size(pos), int::integer-unit(8)-size(size), _rest::binary>> = data
+20
test/encoding_test.exs
··· 125 125 6 -> -(2 ** 63) 126 126 7 -> Enum.random(1..((2 ** 64) - 1)) 127 127 8 -> -Enum.random(1..((2 ** 63))) 128 + 9 -> random_binary() 128 129 _ -> nil 130 + end 131 + end 132 + 133 + defp random_binary do 134 + case random_binary_size() do 135 + 0 -> 136 + "" 137 + size -> 138 + Enum.reduce(1..size, "", fn _i, acc -> 139 + b = Enum.random(0..255) 140 + <<acc::binary, b>> 141 + end) 142 + end 143 + end 144 + 145 + defp random_binary_size do 146 + case Enum.random(1..100) do 147 + 1 -> Enum.random(101..10_000) 148 + _ -> Enum.random(0..100) 129 149 end 130 150 end 131 151 end