Add jgvariant-ostree module.

Change-Id: Idf7bacad28d7cf65eb1ddd0994dcc2c2c2a7e18e
diff --git a/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java
new file mode 100644
index 0000000..2b09645
--- /dev/null
+++ b/jgvariant-ostree/src/main/java/eu/mulk/jgvariant/ostree/DeltaSuperblock.java
@@ -0,0 +1,43 @@
+package eu.mulk.jgvariant.ostree;
+
+import eu.mulk.jgvariant.core.Decoder;
+import java.nio.ByteOrder;
+import java.util.List;
+
+/** Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_SUPERBLOCK_FORMAT} */
+public record DeltaSuperblock(
+    Metadata metadata,
+    long timestamp,
+    Checksum fromChecksum,
+    Checksum toChecksum,
+    Commit commit,
+    List<DeltaName> dependencies,
+    List<DeltaMetaEntry> entries,
+    List<DeltaFallback> fallbacks) {
+
+  public record DeltaName(Checksum fromChecksum, Checksum toChecksum) {
+
+    private static final Decoder<DeltaName> DECODER =
+        Decoder.ofStructure(DeltaName.class, Checksum.decoder(), Checksum.decoder());
+
+    public static Decoder<DeltaName> decoder() {
+      return DECODER;
+    }
+  }
+
+  private static final Decoder<DeltaSuperblock> DECODER =
+      Decoder.ofStructure(
+          DeltaSuperblock.class,
+          Metadata.decoder(),
+          Decoder.ofLong().withByteOrder(ByteOrder.BIG_ENDIAN),
+          Checksum.decoder(),
+          Checksum.decoder(),
+          Commit.decoder(),
+          Decoder.ofByteArray().map(x -> List.of()), // FIXME
+          Decoder.ofArray(DeltaMetaEntry.decoder()),
+          Decoder.ofArray(DeltaFallback.decoder()));
+
+  public static Decoder<DeltaSuperblock> decoder() {
+    return DECODER;
+  }
+}