diff --git a/src/datatype.h b/src/datatype.h
new file mode 100644
index 0000000..d568c91
--- /dev/null
+++ b/src/datatype.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <variant>
+#include "datatypes/primitives.h"
+
+typedef std::variant<StringData, IntData, FloatData> DataValue;
+
+const uint DAT_STRING = 0;
+const uint DAT_INT = 1;
+const uint DAT_FLOAT = 2;
\ No newline at end of file
diff --git a/src/datatypes/primitives.cpp b/src/datatypes/primitives.cpp
new file mode 100644
index 0000000..2170d4a
--- /dev/null
+++ b/src/datatypes/primitives.cpp
@@ -0,0 +1,11 @@
+#include "primitives.h"
+
+StringData::StringData(std::string str) : wrapped(str) {}
+StringData::operator std::string() { return wrapped; }
+
+IntData::IntData(int in) : wrapped(in) {}
+IntData::operator int() { return wrapped; }
+
+FloatData::FloatData(float in) : wrapped(in) {}
+FloatData::operator float() { return wrapped; }
+
diff --git a/src/datatypes/primitives.h b/src/datatypes/primitives.h
new file mode 100644
index 0000000..169d5e6
--- /dev/null
+++ b/src/datatypes/primitives.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <string>
+
+class StringData {
+    std::string wrapped;
+public:
+    StringData(std::string);
+    operator std::string();
+};
+
+class IntData {
+    int wrapped;
+public:
+    IntData(int);
+    operator int();
+};
+
+class FloatData {
+    float wrapped;
+public:
+    FloatData(float);
+    operator float();
+};
\ No newline at end of file