File size: 745 Bytes
3e21b19 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | defmodule Plausible.Billing.Ecto.Feature do
@moduledoc """
Ecto type representing a feature. Features are cast and stored in the
database as strings and loaded as modules, for example: `"props"` is loaded
as `Plausible.Billing.Feature.Props`.
"""
use Ecto.Type
def type, do: :string
def cast(feature) when is_binary(feature) do
found =
Enum.find(Plausible.Billing.Feature.list(), fn mod ->
Atom.to_string(mod.name()) == feature
end)
if found, do: {:ok, found}, else: :error
end
def cast(mod) when is_atom(mod) do
{:ok, mod}
end
def load(feature) when is_binary(feature) do
cast(feature)
end
def dump(mod) when is_atom(mod) do
{:ok, Atom.to_string(mod.name())}
end
end
|