types.exs (1475B)
1 defmodule CustomPermalink do 2 def type, do: :id 3 4 def cast(string) when is_binary(string) do 5 case Integer.parse(string) do 6 {int, _} -> {:ok, int} 7 :error -> :error 8 end 9 end 10 11 def cast(integer) when is_integer(integer), do: {:ok, integer} 12 def cast(_), do: :error 13 14 def load(integer) when is_integer(integer), do: {:ok, integer} 15 def dump(integer) when is_integer(integer), do: {:ok, integer} 16 end 17 18 defmodule PrefixedString do 19 use Ecto.Type 20 def type(), do: :string 21 def cast(string), do: {:ok, string} 22 def load(string), do: {:ok, "PREFIX-" <> string} 23 def dump("PREFIX-" <> string), do: {:ok, string} 24 def dump(_string), do: :error 25 def embed_as(_), do: :dump 26 end 27 28 defmodule WrappedInteger do 29 use Ecto.Type 30 def type(), do: :integer 31 def cast(integer), do: {:ok, {:int, integer}} 32 def load(integer), do: {:ok, {:int, integer}} 33 def dump({:int, integer}), do: {:ok, integer} 34 end 35 36 defmodule ParameterizedPrefixedString do 37 use Ecto.ParameterizedType 38 def init(opts), do: Enum.into(opts, %{}) 39 def type(_), do: :string 40 41 def cast(data, %{prefix: prefix}) do 42 if String.starts_with?(data, [prefix <> "-"]) do 43 {:ok, data} 44 else 45 {:ok, prefix <> "-" <> data} 46 end 47 end 48 49 def load(string, _, %{prefix: prefix}), do: {:ok, prefix <> "-" <> string} 50 def dump(nil, _, _), do: {:ok, nil} 51 def dump(data, _, %{prefix: _prefix}), do: {:ok, data |> String.split("-") |> List.last()} 52 def embed_as(_, _), do: :dump 53 end