defmodule TribesPlugin.Options do @moduledoc false @capability_regex ~r/\A[a-z][a-z0-9_-]*(\.[a-z][a-z0-9_-]*)+@[1-9][0-9]*\z/ def parse_capabilities(value) when value in [nil, ""], do: [] def parse_capabilities(value) when is_binary(value) do value |> String.split(",", trim: true) |> Enum.map(&String.trim/1) |> Enum.reject(&(&1 == "")) |> Enum.map(&validate_capability!/1) end def parse_capabilities(values) when is_list(values) do values |> Enum.flat_map(&parse_capabilities/1) |> Enum.uniq() end def with_default_requires(opts) do live_view? = Keyword.get(opts, :live_view?, true) requires = opts |> Keyword.get(:requires, []) |> parse_capabilities() |> maybe_ensure_ui(live_view?) Keyword.put(opts, :requires, requires) end defp maybe_ensure_ui(requires, true), do: ensure_capability(requires, "org.tribe-one.caps.ui@1") defp maybe_ensure_ui(requires, false), do: requires defp ensure_capability(caps, cap) do if cap in caps, do: caps, else: caps ++ [cap] end defp validate_capability!(value) do if Regex.match?(@capability_regex, value) do value else raise ArgumentError, "capability must be fully-qualified name@version, got: #{inspect(value)}" end end end