defmodule CoderRing.Memo do @moduledoc """ Schema for a coder ring state. """ use Ecto.Schema import Ecto.Changeset alias Ecto.Changeset alias __MODULE__ @primary_key {:name, :string, []} schema "code_memos" do field :extra, :string, default: "" field :uniquizer_num, :integer, default: 0 field :last_max_pos, :integer, default: 0 end @typedoc """ * `:name` - Name of the code type. (eg. "rx") * `:extra` - Additional prefix last used by the caller. If we get a new one, `:uniquizer_num` is reset to 0 and the ring is reset. * `:uniquizer_num` - A number to be passed to `integer_to_string/1` for an extra value to be used between `:caller_extra` and the base code. * `:last_max_pos` - Position of the code record last used as "max". """ @type t :: %Memo{ name: String.t(), extra: String.t(), uniquizer_num: non_neg_integer, last_max_pos: non_neg_integer } @doc "Create a new Memo struct." @spec new(keyword) :: t def new(args \\ []) do struct(Memo, args) end @doc "Changeset for creating a new memo." @spec changeset(t | Changeset.t(), map) :: Changeset.t() def changeset(memo_or_changeset, params) do required = [:name] memo_or_changeset |> cast(params, required) |> validate_required(required) |> update_changeset(params) end @doc "Changeset for updating an existing memo." @spec update_changeset(t | Changeset.t(), map) :: Changeset.t() def update_changeset(memo_or_changeset, params \\ %{}) do optional = [:extra, :uniquizer_num, :last_max_pos] memo_or_changeset |> cast(params, optional) end end