Независимая реализация 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.1
export type Version {
    ro major u64
    ro minor u64
    ro patch u64
    ro pre   []str
    ro build []str
}

Версия SemVer (semver.org 2.0.0). Все поля roVersion неизменяем; операции возвращают новое значение. pre хранит идентификаторы pre-release, разбитые по . (например, "alpha.1"["alpha", "1"]). build хранит идентификаторы метаданных сборки; они не учитываются при сравнении приоритета.

ParseVersionError

стабильно с 0.1
export 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.1
fn 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.1
fn 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.1
fn Version.full(major u64, minor u64, patch u64, pre []str, build []str) -> Self

Полный конструктор с явными массивами pre-release и метаданных сборки.


Проверка состояния

is_prerelease

стабильно с 0.1
fn Version @is_prerelease() -> bool

Возвращает true, если версия имеет хотя бы один идентификатор pre-release.

is_stable

стабильно с 0.1
fn 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.1
fn 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.1
fn 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.1
fn 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.1
fn 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")