igniter/lib/version.ex
2024-06-12 19:16:03 -04:00

44 lines
1.1 KiB
Elixir

defmodule Igniter.Version do
@moduledoc "Utilities for working versions and version requirements"
@doc """
Provides a general requirement for a given version string.
For example
`3.1.2` would be `~> 3.0`
and
`0.2.4` would be `~> 0.2`
"""
@spec version_string_to_general_requirement!(String.t()) :: String.t() | no_return
def version_string_to_general_requirement!(version) do
case version_string_to_general_requirement(version) do
{:ok, requirement} -> requirement
{:error, error} -> raise ArgumentError, error
end
end
def version_string_to_general_requirement(version) do
version
|> pad_zeroes()
|> Version.parse()
|> case do
{:ok, %Version{major: 0, minor: minor}} ->
{:ok, "~> 0.#{minor}"}
{:ok, %Version{major: major}} ->
{:ok, "~> #{major}.0"}
:error ->
{:error, "invalid version string"}
end
end
defp pad_zeroes(version) do
case String.split(version, ".", trim: true) do
[_major, _minor] -> version <> ".0"
[_major] -> version <> ".0.0"
_ -> version
end
end
end