lib/mix/tasks/riva.modules.compile.ex

defmodule Mix.Tasks.Riva.Modules.Compile do
  @moduledoc "Printed when the user requests `mix help echo`"
  @shortdoc "Compile nvidia riva elixir modules from common proto definitions"

  use Mix.Task

  alias Mix.Context

  @impl Mix.Task
  def run(args) do
    ctx = Context.new(args)

    cmd = "earthly -P --ci \
      --build-arg ELIXIR_VERSION=\"#{ctx.elixir_version}\" \
      --build-arg PROTOC_VERSION=\"#{ctx.protoc_version}\" \
      --build-arg NVIDIA_RIVA_COMMON_TAG=\"#{ctx.nvidia_riva_common_tag}\" \
      --artifact +build/riva #{ctx.module_output_dir}"

    IO.inspect(cmd)
    Mix.shell().cmd(cmd)
    update_package_version(ctx.nvidia_riva_common_tag)
    update_readme_version(ctx.nvidia_riva_common_tag)
    update_elixir_version(ctx.elixir_version_major_and_minor)
  end

  defp update_readme_version(tag) do
    {:ok, content} = File.read("README.md")

    release_version = Regex.replace(~r/^[^0-9]*/, tag, "")
    # perform the regex replacement
    new_content =
      Regex.replace(
        ~r/(\{:ex_nvidia_riva_modules, \")~>[^"]+"/,
        content,
        "\\1~> #{release_version}\""
      )

    # write the modified content back to the file
    File.write!("README.md", new_content)
  end

  defp update_package_version(tag) do
    {:ok, content} = File.read("mix.exs")

    release_version = Regex.replace(~r/^[^0-9]*/, tag, "")
    # perform the regex replacement
    new_content =
      Regex.replace(
        ~r/(version:\s*)"[0-9]+\.[0-9]+"/,
        content,
        "\\1\"#{release_version}\""
      )

    # write the modified content back to the file
    File.write!("mix.exs", new_content)
  end

  defp update_elixir_version(elixir_version) do
    {:ok, content} = File.read("mix.exs")

    # perform the regex replacement
    new_content =
      Regex.replace(
        ~r/(elixir: ~>) "[0-9]+\.[0-9]+"/,
        content,
        "\\1 \"#{elixir_version}\""
      )

    # write the modified content back to the file
    File.write!("mix.exs", new_content)
  end
end