Packages

Cafex is a pure Elixir implementation of Kafka client.

Current section

Files

Jump to
misha_cafex lib cafex protocol describe_groups.ex
Raw

lib/cafex/protocol/describe_groups.ex

defmodule Cafex.Protocol.DescribeGroups do
use Cafex.Protocol, api: :describe_groups
defrequest do
field :groups, [group_id]
@type group_id :: binary
end
defresponse do
field :groups, [group]
@type group :: %{error: Cafex.Protocol.error,
group_id: binary,
state: binary,
protocol_type: binary,
protocol: binary,
members: [member]}
@type member :: %{member_id: binary,
client_id: binary,
client_host: binary,
member_metadata: Cafex.Protocol.JoinGroup.Request.protocol_metadata,
member_assignment: Cafex.Protocol.SyncGroup.Request.member_assignment}
end
def encode(%{groups: groups}) do
groups
|> encode_array(&Cafex.Protocol.encode_string/1)
|> IO.iodata_to_binary
end
def decode(data) when is_binary(data) do
{groups, _} = decode_array(data, &parse_group/1)
%Response{groups: groups}
end
defp parse_group(<< error_code :: 16-signed,
group_id_len :: 16-signed,
group_id :: size(group_id_len)-binary,
state_len :: 16-signed,
state :: size(state_len)-binary,
protocol_type_len :: 16-signed,
protocol_type :: size(protocol_type_len)-binary,
protocol_len :: 16-signed,
protocol :: size(protocol_len)-binary,
rest :: binary >>) do
{members, rest} = decode_array(rest, &parse_member/1)
{%{error: decode_error(error_code),
group_id: group_id,
state: state,
protocol_type: protocol_type,
protocol: protocol,
members: members}, rest}
end
defp parse_member(<< member_id_len :: 16-signed,
member_id :: size(member_id_len)-binary,
client_id_len :: 16-signed,
client_id :: size(client_id_len)-binary,
client_host_len :: 16-signed,
client_host :: size(client_host_len)-binary,
member_metadata_len :: 32-signed,
member_metadata :: size(member_metadata_len)-binary,
member_assignment_len :: 32-signed,
member_assignment :: size(member_assignment_len)-binary,
rest :: binary>>) do
member_metadata = parse_group_protocol_metadata(member_metadata)
member_assignment = parse_assignment(member_assignment)
{%{member_id: member_id,
client_id: client_id,
client_host: client_host,
member_metadata: member_metadata,
member_assignment: member_assignment}, rest}
end
end