defmodule Mix.Context do
alias Mix.Context
defstruct elixir_version: nil,
elixir_version_major_and_minor: nil,
protoc_version: nil,
nvidia_riva_common_tag: nil,
module_output_dir: nil
def new(args) do
{parsed, _, _} =
OptionParser.parse(args,
strict: [
elixir_version: :string,
protoc_version: :string,
nvidia_riva_common_tag: :string,
module_output_dir: :string
]
)
# default values for build
elixir_version =
Keyword.get(
parsed,
:elixir_version,
elixir_version_from_tool_versions_file(".tool-versions")
)
elixir_version_major_and_minor =
parse_majorand_minor_numbers_from_elixir_version_string(elixir_version)
protoc_version = Keyword.get(parsed, :protoc_version, "23.1")
nvidia_riva_common_tag = Keyword.get(parsed, :nvidia_riva_common_tag, "r2.11.0")
module_output_dir = Keyword.get(parsed, :module_output_dir, "./lib/riva")
%Context{
elixir_version: elixir_version,
elixir_version_major_and_minor: elixir_version_major_and_minor,
protoc_version: protoc_version,
nvidia_riva_common_tag: nvidia_riva_common_tag,
module_output_dir: module_output_dir
}
end
defp parse_tool_versions_file(file_path) do
file_path
|> File.read!()
|> String.trim()
|> String.split("\n")
|> Enum.map(fn line ->
[tool, version] = String.split(line)
{String.to_atom(tool), version}
end)
|> Enum.into([])
end
defp elixir_version_from_tool_versions_file(file_path) do
file_path
|> parse_tool_versions_file
|> Keyword.get(:elixir)
end
defp parse_majorand_minor_numbers_from_elixir_version_string(elixir_version) do
Regex.run(~r/^[0-9]+\.[0-9]+/, elixir_version)
end
end