@doc "Streaming `{{ core_path }}` — returns an `Enumerable` of decoded chunk maps."
def {{ stream_fn }}(client, {{ req_param }}) do
req_json =
case {{ req_param }} do
nil -> nil
s when is_binary(s) -> s
other -> Jason.encode!(other)
end
case {{ native_mod }}.{{ start_fn }}(client, req_json) do
{:ok, handle} ->
stream =
Stream.unfold(handle, fn h ->
case {{ native_mod }}.{{ next_fn }}(h) do
{:ok, nil} ->
nil
{:ok, chunk_json} ->
{Jason.decode!(chunk_json, keys: :atoms), h}
{:error, reason} ->
fields = if is_map(reason), do: reason, else: %{}
detail = if is_exception(reason), do: Exception.message(reason), else: inspect(reason)
raise {{ exception_module }},
message: "{{ stream_fn }} stream failed: #{detail}",
reason: reason,
adapter: :{{ stream_fn }},
kind: Map.get(fields, :kind),
status: Map.get(fields, :status),
retry_after_ms: Map.get(fields, :retry_after_ms)
end
end)
{:ok, stream}
{:error, reason} ->
{:error, reason}
end
end