Независимая реализация semver.org 2.0.0. Поддерживает полные строки версий, включая идентификаторы pre-release и метаданные сборки. Сравнение следует правилам приоритета § 11 (метаданные сборки игнорируются).
ro v = Version.from("1.2.3-alpha.1+exp.sha.5114f85")
assert(v.major == 1 && v.is_prerelease())
ro a = Version.from("1.0.0-alpha")
ro b = Version.from("1.0.0")
assert(a < b) // pre-release < release
Типы
Version
стабильно с 0.1export type Version {
ro major u64
ro minor u64
ro patch u64
ro pre []str
ro build []str
}
Версия SemVer (semver.org 2.0.0). Все поля ro — Version неизменяем; операции возвращают новое значение. pre хранит идентификаторы pre-release, разбитые по . (например, "alpha.1" → ["alpha", "1"]). build хранит идентификаторы метаданных сборки; они не учитываются при сравнении приоритета.
ParseVersionError
стабильно с 0.1export type ParseVersionError
| EmptyInput
| MissingMinor
| MissingPatch
| LeadingZero { component str; value str }
| InvalidComponent { component str; value str }
| EmptyIdentifier { section str }
| InvalidIdentifier { section str; value str }
Варианты ошибок, возвращаемые Version.from. Каждый несёт позиционную информацию (component / section + value) для диагностических сообщений.
Конструкторы
Version.from
стабильно с 0.1fn Version.from(s str) Fail[ParseVersionError] -> Self
Разбирает строку semver по грамматике § 9–10. Бросает Fail[ParseVersionError] при любой ошибке. Обрабатывайте блоком with Fail[ParseVersionError].
Примеры
ro v = Version.from("2.5.1")
assert(v.major == 2 && v.minor == 5 && v.patch == 1)
ro v2 = Version.from("1.0.0-beta+exp.sha.5114f85")
assert(v2.pre[0] == "beta")
Version.new
стабильно с 0.1fn Version.new(major u64, minor u64, patch u64) -> Self
Простой конструктор без pre-release и метаданных сборки. Наиболее частый случай.
Примеры
ro v = Version.new(1, 2, 3)
assert(v.into() == "1.2.3")
Version.full
стабильно с 0.1fn Version.full(major u64, minor u64, patch u64, pre []str, build []str) -> Self
Полный конструктор с явными массивами pre-release и метаданных сборки.
Проверка состояния
is_prerelease
стабильно с 0.1fn Version @is_prerelease() -> bool
Возвращает true, если версия имеет хотя бы один идентификатор pre-release.
is_stable
стабильно с 0.1fn Version @is_stable() -> bool
Возвращает true, если major > 0 и нет идентификатора pre-release (стабильный релиз по соглашению semver).
Примеры
assert(Version.from("1.0.0").is_stable())
assert(!Version.from("0.9.0").is_stable()) // 0.x.y — unstable
assert(!Version.from("1.0.0-alpha").is_stable()) // pre-release
has_build
стабильно с 0.1fn Version @has_build() -> bool
Возвращает true, если присутствуют метаданные сборки.
Сравнение
Все сравнения реализуют приоритет § 11: major > minor > patch > pre-release. Метаданные сборки игнорируются. Версии pre-release имеют более низкий приоритет, чем релиз (1.0.0-alpha < 1.0.0).
Перегрузка операторов (D46) означает, что v1 < v2, v1 == v2, v1 != v2 работают напрямую.
lt / gt / le / ge
стабильно с 0.1fn Version @lt(other Version) -> bool // <
fn Version @le(other Version) -> bool // <=
fn Version @gt(other Version) -> bool // >
fn Version @ge(other Version) -> bool // >=
Примеры
// semver.org §11 chain example
ro chain = [
Version.from("1.0.0-alpha"),
Version.from("1.0.0-alpha.1"),
Version.from("1.0.0-beta"),
Version.from("1.0.0-rc.1"),
Version.from("1.0.0"),
]
for i in 0..chain.len() - 1 {
assert(chain[i] < chain[i + 1])
}
eq / eq_precedence
стабильно с 0.1fn Version @eq(other Version) -> bool // structural (includes build)
fn Version @eq_precedence(other Version) -> bool // semver §10 (ignores build)
eq — структурное сравнение: сравнивает все поля, включая build. eq_precedence следует § 10 и игнорирует метаданные сборки.
Примеры
ro a = Version.from("1.0.0+build.1")
ro b = Version.from("1.0.0+build.2")
assert(a.eq_precedence(b)) // same precedence
assert(!a.eq(b)) // different build metadata
Сериализация
into
стабильно с 0.1fn Version @into() -> str
Сериализует в MAJOR.MINOR.PATCH[-PRE][+BUILD]. Round-trip: Version.from(v.into()).eq(v) выполняется для любого корректного Version.
Примеры
ro v = Version.new(1, 2, 3)
ro s str = v.into()
assert(s == "1.2.3")