Skip to content

ddn.util.semver

This page provides runnable examples for working with semantic versions using the ddn.util.semver module.


1) Parse a version and inspect components

#!/usr/bin/env dub
/+ dub.sdl:
    name "semver-parse"
    dependency "ddn" version="*"
+/
module examples.semver_parse;

import std.stdio : writeln, writefln;
import ddn.util.semver;

void main() {
   auto v = SemVer.parse("1.2.3-alpha.1+build.5");

   writefln("major=%s minor=%s patch=%s", v.major, v.minor, v.patch);
   writeln("prerelease = ", v.prerelease);
   writeln("build      = ", v.build);
   writeln("string     = ", v.toString());
}

2) Compare and sort versions

SemVer implements ordering (via opCmp), so you can sort versions naturally.

#!/usr/bin/env dub
/+ dub.sdl:
    name "semver-sort"
    dependency "ddn" version="*"
+/
module examples.semver_sort;

import std.stdio : writeln;
import std.algorithm : map, sort;
import std.array : array;
import ddn.util.semver;

void main() {
   string[] inputs = [
      "1.0.0",
      "1.0.0-alpha",
      "1.0.0-alpha.1",
      "1.0.0+20130313144700",
      "2.0.0-rc.1",
      "2.0.0",
   ];

   auto versions = inputs.map!(s => SemVer.parse(s)).array;
   versions.sort();

   writeln("Sorted:");
   foreach (v; versions)
      writeln("  ", v.toString());
}

3) Validate user input (error handling)

When parsing user-provided strings, handle SemVerParseException.

#!/usr/bin/env dub
/+ dub.sdl:
    name "semver-validate"
    dependency "ddn" version="*"
+/
module examples.semver_validate;

import std.stdio : writeln, writefln;
import ddn.util.semver;

void main() {
   foreach (s; ["1.2.3", "01.2.3", "1.2", "1.2.3-beta"])
      tryParse(s);
}

void tryParse(string s) {
   try {
      auto v = SemVer.parse(s);
      writefln("OK   %s -> %s", s, v.toString());
   } catch (SemVerParseException e) {
      writefln("FAIL %s -> %s", s, e.msg);
   }
}