Skip to content

Example: Semantic Versioning with ddn.var.semver

This example demonstrates how to use the ddn.var.semver module to parse, sort, and display semantic version numbers in D. The code is based on the demo/var/semver.d file.


Example Code

/+ dub.sdl:
     name "var-semver"
     dependency "ddn" version=">=1.0.0"
+/

/**
  * Demo application for ddn.var.semver
  * Creates a list of SemVer objects (pre-release, release, build metadata),
  * sorts them, and prints the sorted list.
  * dub build --single demo/var/semver.d && demo/var/demo-var-semver
  */

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

void main() {
   // Define a variety of SemVer strings
   string[] versionStrings = [
      "1.0.0", // release
      "1.0.0-alpha", // pre-release
      "1.0.0-alpha.1", // pre-release
      "1.0.0-0.3.7", // pre-release
      "1.0.0-x.7.z.92", // pre-release
      "1.0.0+20130313144700", // build metadata (post-release)
      "1.0.0-beta+exp.sha.5114f85", // pre-release + build metadata
      "2.0.0", // release
      "2.0.0+build.1848", // build metadata (post-release)
      "2.0.0-beta", // pre-release
      "2.0.0-beta.2", // pre-release
      "2.0.0-beta.11", // pre-release
      "2.0.0-rc.1", // pre-release
      "2.0.0-alpha", // pre-release
      "0.1.0", // release
      "0.1.0-alpha", // pre-release
      "0.1.0+build.1", // build metadata (post-release)
      "1.0.0+build.1", // build metadata (post-release)
      "1.0.0+build.2", // build metadata (post-release)
      "1.0.1", // release
      "1.1.0", // release
      "1.0.0-rc.1", // pre-release
      "1.0.0-rc.1+build.1", // pre-release + build metadata
   ];

   // Parse into SemVer objects
   auto versions = versionStrings
      .map!(s => SemVer.parse(s))
      .array;

   // Shuffle the list to ensure it's unsorted (optional, but for demo)
   import std.random : randomShuffle;

   randomShuffle(versions);

   // Sort the versions (uses opCmp)
   versions.sort();

   // Output the sorted list
   writeln("Sorted Semantic Versions:");
   foreach (v; versions)
      writeln(v.toString());
}

What This Example Shows

  • Parsing: Converts a variety of semantic version strings into SemVer objects.
  • Sorting: Demonstrates how semantic versions are sorted according to the SemVer specification.
  • Display: Prints the sorted list of versions.

Output Example

The output will be a sorted list of semantic versions, with pre-releases and build metadata handled according to the SemVer rules. Example output:

Sorted Semantic Versions:
0.1.0-alpha
0.1.0
0.1.0+build.1
1.0.0-0.3.7
1.0.0-alpha
1.0.0-alpha.1
1.0.0-beta+exp.sha.5114f85
1.0.0-rc.1
1.0.0
1.0.0+20130313144700
1.0.0+build.1
1.0.0+build.2
1.0.1
1.1.0
2.0.0-alpha
2.0.0-beta
2.0.0-beta.2
2.0.0-beta.11
2.0.0-rc.1
2.0.0
2.0.0+build.1848

See Also