lib/mix/tasks/freebsd.ex

defmodule Mix.Tasks.Freebsd do
  @moduledoc "Generate FreeBSD port files: `mix help freebsd`"

  use Mix.Task

  @shortdoc "Generates FreeBSD port files"
  def run(_) do
    result = EEx.eval_file("freebsd/Makefile.eex", assigns: assigns())
    File.write!("freebsd/Makefile", result)
  end

  defp assigns do
    %{
      port_name: port_name(),
      port_version: port_version(),
      port_categories: port_categories(),
      port_maintainer: port_maintainer(),
      port_comment: port_comment(),
      github_project: github_project(),
      github_account: github_account(),
      github_tag: github_tag()
    }
  end

  defp port_name do
    {:ok, app} = Mix.Project.config() |> Keyword.fetch(:app)
    app
  end

  defp port_version do
    {:ok, version} = Mix.Project.config() |> Keyword.fetch(:version)
    version
  end

  defp port_comment do
    {:ok, comment} = Mix.Project.config() |> Keyword.fetch(:description)
    comment
  end

  defp freebsd_config do
    {:ok, freebsd} = Mix.Project.config() |> Keyword.fetch(:freebsd)
    freebsd
  end

  defp port_categories do
    {:ok, categories} = freebsd_config() |> Keyword.fetch(:categories)
    categories
  end

  defp port_maintainer do
    {:ok, maintainer} = freebsd_config() |> Keyword.fetch(:maintainer)
    maintainer
  end

  defp github_account do
    {:ok, github_account} = freebsd_config() |> Keyword.fetch(:github_account)
    github_account
  end

  defp github_project do
    {:ok, github_project} = freebsd_config() |> Keyword.fetch(:github_project)
    github_project
  end

  defp github_tag do
    {:ok, github_tag} = freebsd_config() |> Keyword.fetch(:github_tag)
    github_tag
  end
end