defmodule MessagePack.RPC.Message do @request 0 @response 1 @notify 2 # @no_method_error 0x01 # @argument_error 0x02 defmodule Request, do: defstruct [:id, :method, :params] defmodule Notify, do: defstruct [:method, :params] defmodule Response, do: defstruct [:id, :result] defmodule ErrorResponse, do: defstruct [:id, :error, :description] defmodule InvalidMessage do defexception message: "invalid message" end def build([@request, message_id, method, params]) do %Request{id: message_id, method: method, params: params} end def build([@response, message_id, error, result]) when is_nil(error) do %Response{id: message_id, result: result} end def build([@response, message_id, error, description]) do %ErrorResponse{id: message_id, error: error, description: description} end def build([@notify, method, params]) do %Notify{method: method, params: params} end def build(_) do raise InvalidMessage end def to_raw(%Request{id: message_id, method: method, params: params}) do [@request, message_id, method, params] end def to_raw(%Response{id: message_id, result: result}) do [@response, message_id, nil, result] end def to_raw(%ErrorResponse{id: message_id, error: error}) do [@response, message_id, error, ""] end def to_raw(%Notify{method: method, params: params}) do [@notify, method, params] end end