Current section

Files

Jump to
electric lib electric persistent_kv serialized.ex
Raw

lib/electric/persistent_kv/serialized.ex

defmodule Electric.PersistentKV.Serialized do
@moduledoc """
An implementation of PersistentKV that writes values serialised as JSON to the kv `backend`.
"""
alias Electric.PersistentKV
defstruct [:backend, encoder: {Jason, :encode, []}, decoder: {Jason, :decode, []}]
def new!(opts) do
struct(__MODULE__, opts)
end
defimpl Electric.PersistentKV do
def set(kv, key, value) do
with {:ok, json} <- encode(kv, value) do
PersistentKV.set(kv.backend, key, json)
end
end
def get(kv, key) do
with {:ok, json} <- PersistentKV.get(kv.backend, key) do
decode(kv, json)
end
end
defp encode(%{encoder: {m, f, a}}, term) do
apply(m, f, [term | a])
end
defp decode(%{decoder: {m, f, a}}, json) do
apply(m, f, [json | a])
end
end
end