defmodule Memcache.BinaryUtils do @moduledoc false @ops [ GET: 0x00, SET: 0x01, ADD: 0x02, REPLACE: 0x03, DELETE: 0x04, INCREMENT: 0x05, DECREMENT: 0x06, QUIT: 0x07, FLUSH: 0x08, GETQ: 0x09, NOOP: 0x0A, VERSION: 0x0B, GETK: 0x0C, GETKQ: 0x0D, APPEND: 0x0E, PREPEND: 0x0F, STAT: 0x10, SETQ: 0x11, ADDQ: 0x12, REPLACEQ: 0x13, DELETEQ: 0x14, INCREMENTQ: 0x15, DECREMENTQ: 0x16, QUITQ: 0x17, FLUSHQ: 0x18, APPENDQ: 0x19, PREPENDQ: 0x1A, AUTH_LIST: 0x20, AUTH_START: 0x21, AUTH_STEP: 0x22 ] defmacro opb(x) do quote do << unquote(Keyword.fetch!(@ops, x)) >> end end defmacro op(x) do quote do unquote(Keyword.fetch!(@ops, x)) end end defmodule Header do @moduledoc false defstruct opcode: nil, key_length: nil, extra_length: nil, data_type: nil, status: nil, total_body_length: nil, opaque: nil, cas: nil end defmacro defparse_empty(name) do quote do def parse_body(%Header{ status: 0x0000, opcode: op(unquote(name)), opaque: opaque }, :empty) do { opaque, { :ok }} end end end defmacro defparse_error(code, error) do quote do def parse_body(%Header{ status: unquote(code), opaque: opaque }, _rest) do { opaque, { :error, unquote(error) }} end end end defmacro bcat(binaries) do { parts, _ } = Code.eval_quoted(binaries, [], __CALLER__) quote do unquote(Enum.reduce(parts, <<>>, fn (x, a) -> a <> x end)) end end defmacro request do quote do: << 0x80 >> end defmacro reserved do quote do: << 0x0000 :: size(16) >> end defmacro datatype do quote do: << 0x00 >> end defmacro opaque do quote do: << 0x00 :: size(32) >> end end