Packages
electric_client
0.7.0
0.10.3
0.10.2
0.10.1
0.10.1-beta-1
0.10.0
0.9.5-beta-1
0.9.4
0.9.4-beta-1
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.3-beta-1
0.8.2
0.8.1
0.8.0
0.8.0-beta-1
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.5-beta-5
0.6.5-beta-4
0.6.5-beta-3
0.6.5-beta-2
0.6.5-beta-1
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.5.0-beta-1
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.3.0-beta.4
0.3.0-beta.3
0.3.0-beta.2
0.2.6-pre-1
retired
0.2.6-beta.1
0.2.6-beta.0
0.2.5
0.2.4
0.2.4-pre-8
0.2.4-pre-7
0.2.4-pre-6
0.2.4-pre-5
0.2.4-pre-4
0.2.4-pre-3
0.2.4-pre-2
0.2.4-pre-1
0.2.3
0.2.3-rc-1
0.2.2
0.2.2-rc-1
0.2.1
0.2.1-rc-3
0.2.1-rc-2
0.2.1-rc-1
0.2.0
0.1.2
0.1.1
0.1.0
0.1.0-dev-9
0.1.0-dev-8
0.1.0-dev-7
0.1.0-dev-6
0.1.0-dev-5
0.1.0-dev-4
0.1.0-dev-3
0.1.0-dev-2
0.1.0-dev-17
0.1.0-dev-16
0.1.0-dev-15
0.1.0-dev-14
0.1.0-dev-13
0.1.0-dev-12
0.1.0-dev-11
0.1.0-dev-10
0.1.0-dev
Elixir client for ElectricSQL
Current section
Files
Jump to
Current section
Files
lib/electric/client/fetch/response.ex
defmodule Electric.Client.Fetch.Response do
alias Electric.Client
defstruct [
:status,
:last_offset,
:shape_handle,
:schema,
:next_cursor,
:request_timestamp,
body: [],
headers: %{}
]
@type t :: %__MODULE__{
status: non_neg_integer(),
body: [map()],
headers: %{String.t() => [String.t()]},
last_offset: nil | Client.Offset.t(),
shape_handle: nil | Client.shape_handle(),
schema: nil | Client.schema(),
next_cursor: nil | Client.cursor(),
request_timestamp: DateTime.t()
}
@doc false
@spec decode!(t()) :: t()
def decode!(%__MODULE__{headers: headers} = resp) do
resp
|> Map.put(:shape_handle, decode_shape_handle(headers))
|> Map.put(:last_offset, decode_offset(headers))
|> Map.put(:schema, decode_schema(headers))
|> Map.put(:next_cursor, decode_next_cursor(headers))
end
@doc false
@spec decode!(pos_integer(), %{optional(binary()) => binary()}, [term()], DateTime.t()) :: t()
def decode!(status, headers, body, timestamp \\ DateTime.utc_now())
when is_integer(status) and is_map(headers) do
%__MODULE__{
status: status,
headers: decode_headers(headers),
body: body,
shape_handle: decode_shape_handle(headers),
last_offset: decode_offset(headers),
schema: decode_schema(headers),
next_cursor: decode_next_cursor(headers),
request_timestamp: timestamp
}
end
defp decode_headers(headers) do
Map.new(headers, fn {k, v} -> {k, List.wrap(v)} end)
end
defp decode_shape_handle(%{"electric-handle" => shape_handle}) do
unlist(shape_handle)
end
defp decode_shape_handle(_headers), do: nil
defp decode_offset(%{"electric-offset" => offset}) do
unlist(offset)
end
defp decode_offset(_headers), do: nil
defp decode_schema(%{"electric-schema" => schema}) do
schema |> unlist() |> Jason.decode!(keys: :atoms)
end
defp decode_schema(_headers), do: nil
defp unlist([elem | _]), do: elem
defp unlist([]), do: nil
defp unlist(value), do: value
defp decode_next_cursor(%{"electric-cursor" => cursor}) do
cursor |> unlist() |> String.to_integer()
end
defp decode_next_cursor(_), do: nil
end