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 = payload_size * 8 case parse_payload(size, payload) do {:ok, frame_payload, rest} -> {:ok, %Kadabra.Frame{ length: payload_size, type: frame_type, flags: flags, stream_id: stream_id, payload: frame_payload }, 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 end