Current section

Files

Jump to
nous lib nous persistence.ex
Raw

lib/nous/persistence.ex

defmodule Nous.Persistence do
@moduledoc ~S"""
Behaviour for pluggable persistence backends.
Implement this behaviour to store and retrieve serialized agent contexts.
See `Nous.Persistence.ETS` for a reference implementation.
## Example
defmodule MyApp.RedisPersistence do
@behaviour Nous.Persistence
@impl true
def save(session_id, data) do
Redix.command(:redix, ["SET", "nous:#{session_id}", Jason.encode!(data)])
:ok
end
@impl true
def load(session_id) do
case Redix.command(:redix, ["GET", "nous:#{session_id}"]) do
{:ok, nil} -> {:error, :not_found}
{:ok, json} -> {:ok, Jason.decode!(json, keys: :atoms)}
end
end
@impl true
def delete(session_id) do
Redix.command(:redix, ["DEL", "nous:#{session_id}"])
:ok
end
@impl true
def list do
{:ok, keys} = Redix.command(:redix, ["KEYS", "nous:*"])
{:ok, Enum.map(keys, &String.replace_prefix(&1, "nous:", ""))}
end
end
"""
@doc "Save serialized context data for a session."
@callback save(session_id :: String.t(), data :: map()) :: :ok | {:error, term()}
@doc "Load serialized context data for a session."
@callback load(session_id :: String.t()) ::
{:ok, map()} | {:error, :not_found} | {:error, term()}
@doc "Delete persisted data for a session."
@callback delete(session_id :: String.t()) :: :ok | {:error, term()}
@doc "List all persisted session IDs."
@callback list() :: {:ok, [String.t()]} | {:error, term()}
end