feat: implement tostring for SemverImpl

* `SemverImpl:__tostring` - Allows for stringifying a parsed semver instance
* Add TODO comment for future erroring for bad ordinal format
This commit is contained in:
Erica Marigold 2024-11-21 17:20:48 +00:00
parent 0d5629f3a6
commit ab6e993879
2 changed files with 55 additions and 0 deletions

View file

@ -296,6 +296,8 @@ function Semver.parse(ver: string): SemverResult<SemverImpl>
local potentialOrdinalNumber, potentialBuildMetadata = string.match(components[4], "(%d)+(.*)")
if potentialOrdinalNumber == nil then
return badPrereleaseType(components[4])
-- TODO: If there are components after the 4th index, we
-- should error
end
if potentialBuildMetadata ~= nil then
@ -395,4 +397,24 @@ function Semver.__le(left: SemverImpl, right: SemverImpl): boolean
else prereleaseLe(left.prerelease:unwrapOrNil(), right.prerelease:unwrapOrNil())
end
function Semver.__tostring(self: SemverImpl): string
local base = `{self.major}.{self.minor}.{self.patch}`
local prerelease = self.prerelease
:map(function(prerelease: PrereleaseVersion)
return `-{prerelease.type}{prerelease.ordinal
:map(function(ord: number)
return `.{ord}`
end)
:unwrapOr("")}`
end)
:unwrapOr("")
local build = self.buildMetadata
:map(function(buildMetadata: string)
return `+{buildMetadata}`
end)
:unwrapOr("")
return base .. prerelease .. build
end
return Semver

33
tests/tostring.luau Normal file
View file

@ -0,0 +1,33 @@
local frktest = require("@pkg/frktest")
local test = frktest.test
local check = frktest.assert.check
local Option = require("../luau_packages/option")
type Option<T> = Option.Option<T>
local Semver = require("../lib")
return function()
test.suite("Stringification tests", function()
test.case("A parsed version when stringified should not change", function()
local versions = {
"1.2.3",
"1.0.0-alpha",
"2.3.4-beta.1",
"3.0.0-rc.1+build.123",
"4.5.6+sha.xyz",
"5.0.0-alpha.1+build.999",
"6.7.8-beta.2+exp.sha.5114f85",
"7.0.0-alpha.1",
"9.9.9+20230615",
}
for _, version in versions do
local parsed = Semver.parse(version):unwrap()
local stringified = tostring(parsed)
check.equal(stringified, version)
end
end)
end)
end