defmodule Kadabra.Frame do @moduledoc false defstruct [:length, :type, :flags, :stream_id, :payload] @type t :: %__MODULE__{ length: non_neg_integer, type: non_neg_integer, flags: non_neg_integer, stream_id: non_neg_integer, payload: bitstring } @spec new(binary) :: {:ok, t, binary} | {:error, binary} def new(<> = bin) do size = p_size * 8 case parse_payload(size, p) do {:ok, frame_payload, rest} -> frame = %__MODULE__{ length: p_size, type: type, flags: f, stream_id: s_id, payload: frame_payload } {:ok, frame, rest} {:error, _bin} -> {:error, bin} end end def new(bin), do: {:error, bin} defp parse_payload(size, bin) do case bin do <> -> {:ok, <>, <>} bin -> {:error, <>} end end @spec binary_frame(integer, integer, integer, binary) :: binary def binary_frame(frame_type, flags, stream_id, payload) do size = byte_size(payload) header = <> <> end end defimpl Kadabra.Encodable, for: Kadabra.Frame do alias Kadabra.Frame def to_bin(%{type: type, flags: flags, stream_id: sid, payload: p}) do Frame.binary_frame(type, flags, sid, p) end end