Basic decoding of GVariant values (except for Variant).

Change-Id: I43e495a57c1f045b91ce01d89f2010f61b5fb8f5
diff --git a/src/main/java/eu/mulk/jgvariant/core/Value.java b/src/main/java/eu/mulk/jgvariant/core/Value.java
new file mode 100644
index 0000000..969f240
--- /dev/null
+++ b/src/main/java/eu/mulk/jgvariant/core/Value.java
@@ -0,0 +1,35 @@
+package eu.mulk.jgvariant.core;
+
+import java.util.List;
+import java.util.Optional;
+
+/** A value representable by the GVariant serialization format. */
+public sealed interface Value {
+
+  // Composite types
+  record Array<T extends Value>(List<T> values) implements Value {}
+
+  record Maybe<T extends Value>(Optional<T> value) implements Value {}
+
+  record Structure<T extends Record>(T values) implements Value {}
+
+  record Variant(Class<? extends Value> type, Value value) implements Value {}
+
+  // Primitive types
+  record Bool(boolean value) implements Value {
+    static Bool TRUE = new Bool(true);
+    static Bool FALSE = new Bool(false);
+  }
+
+  record Int8(byte value) implements Value {}
+
+  record Int16(short value) implements Value {}
+
+  record Int32(int value) implements Value {}
+
+  record Int64(long value) implements Value {}
+
+  record Float64(double value) implements Value {}
+
+  record Str(String value) implements Value {}
+}