CMDCSkillEngine.Store.Backend behaviour (cmdc_skill_engine v0.2.1)

Copy Markdown View Source

Skill 持久化后端 behaviour。

v0.2 新增 — 把 CMDCSkillEngine.Store 的存储细节从 GenServer 主体里解耦, 让同一个 GenServer 可以在不同场景下挂载不同后端:

约定

  • 所有回调接收/返回 state,由 Store 持有、不可见于外部调用方
  • 回调 不得抛异常,失败返回 {:error, reason}
  • save_record/2 负责 upsert(若 skill_id 已存在则覆盖)
  • update_counters/3 必须原子性保证同一条 record 的四项计数递增是一致的
  • list_all/1 返回全部 record,由 Store 客户端过滤 is_active,让后端实现尽量简单

自定义后端

defmodule MyApp.PGBackend do
  @behaviour CMDCSkillEngine.Store.Backend

  @impl true
  def init(opts), do: ...

  @impl true
  def get_record(state, skill_id), do: ...
  # ...
end

然后在 CMDCSkillEngine.Store.start_link/1 传入 backend: MyApp.PGBackend

Summary

Types

state()

@type state() :: term()

Callbacks

get_record(state, t)

@callback get_record(state(), String.t()) ::
  {:ok, CMDCSkillEngine.Types.SkillRecord.t()} | {:error, :not_found}

init(keyword)

@callback init(keyword()) :: {:ok, state()} | {:error, term()}

list_all(state)

@callback list_all(state()) ::
  {:ok, [CMDCSkillEngine.Types.SkillRecord.t()]} | {:error, term()}

reset(state)

@callback reset(state()) :: :ok | {:error, term()}

save_record(state, t)

@callback save_record(state(), CMDCSkillEngine.Types.SkillRecord.t()) ::
  {:ok, CMDCSkillEngine.Types.SkillRecord.t()} | {:error, term()}

terminate(state)

@callback terminate(state()) :: :ok

update_counters(state, t, keyword)

@callback update_counters(state(), String.t(), keyword()) ::
  :ok | {:error, :not_found} | {:error, term()}