lib/depot/visibility/visibility.ex

defmodule Depot.Visibility do
  @type t :: portable | custom
  @type portable :: :public | :private
  @type custom :: term

  @spec portable?(any) :: boolean
  def portable?(:public), do: true
  def portable?(:private), do: true
  def portable?(_), do: false

  @spec guard_portable(any) :: {:ok, Depot.Visibility.portable()} | :error
  def guard_portable(visibility) do
    if portable?(visibility) do
      {:ok, visibility}
    else
      :error
    end
  end
end