diff --git a/Pf2eDataScrapper/Pf2eDataScrapper.csproj b/Pf2eDataScrapper/Pf2eDataScrapper.csproj
index 2150e37..af748c0 100644
--- a/Pf2eDataScrapper/Pf2eDataScrapper.csproj
+++ b/Pf2eDataScrapper/Pf2eDataScrapper.csproj
@@ -7,4 +7,8 @@
enable
+
+
+
+
diff --git a/Pf2eDataScrapper/Program.cs b/Pf2eDataScrapper/Program.cs
index 3751555..3ed0e5d 100644
--- a/Pf2eDataScrapper/Program.cs
+++ b/Pf2eDataScrapper/Program.cs
@@ -1,2 +1,3 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
+
diff --git a/Pf2eDataScrapper/SchemaBuilder/AbstractSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/AbstractSchemaType.cs
new file mode 100644
index 0000000..5b92be2
--- /dev/null
+++ b/Pf2eDataScrapper/SchemaBuilder/AbstractSchemaType.cs
@@ -0,0 +1,142 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Pf2eDataScrapper.SchemaBuilder
+{
+ internal abstract class AbstractSchemaType
+ {
+ ///
+ /// If the value is nullable.
+ ///
+ public bool IsNullable = false;
+
+ ///
+ /// Mark the value as nullable.
+ ///
+ /// This object
+ public AbstractSchemaType MarkNullable()
+ {
+ IsNullable = true;
+ return this;
+ }
+
+ ///
+ /// Check if type is compatible with current type.
+ ///
+ /// Value to be checked
+ /// True if value is compatible with current type
+ public abstract bool IsCompatibleValue(object value);
+
+ ///
+ /// Adapt to new value.
+ /// If value is compatible with current type, `this` will be returned.
+ /// If value is not compatible, new type will be created.
+ ///
+ /// Value to be checked
+ /// Compatible type
+ public virtual AbstractSchemaType Adapt(object value)
+ {
+ if (IsCompatibleValue(value))
+ {
+ return this;
+ }
+
+ return null;
+ }
+
+ ///
+ /// Add new possible value.
+ ///
+ /// New value
+ public abstract void AddValue(object value);
+
+ ///
+ /// String representation of type.
+ ///
+ ///
+ public abstract string GetTypeName();
+
+ public override abstract string ToString();
+
+
+
+ ///
+ /// Tabulation characters.
+ ///
+ public const string TAB = " ";
+
+ ///
+ /// Limit of elements in list or dictionary to be displayed.
+ ///
+ public const int ElementLimit = 20;
+
+ ///
+ /// Indent text.
+ ///
+ /// Text to be indented
+ /// Indented text
+ public static string Indent(string text)
+ {
+ return text.Replace("\n", "\n" + TAB);
+ }
+
+ ///
+ /// Get string representation of value type.
+ ///
+ /// Value to be checked
+ /// String representation of value type
+ public static string ResolveType(object value)
+ {
+ if (value == null)
+ {
+ return "null";
+ }
+ if (value is string)
+ {
+ return "string";
+ }
+ if (value is bool)
+ {
+ return "bool";
+ }
+ if (value is int)
+ {
+ return "int";
+ }
+ if (value is double)
+ {
+ return "double";
+ }
+ if (value is List