From 53f3ff437d500e904f2b9dd2426124a21bf6279f Mon Sep 17 00:00:00 2001 From: Thorminate Date: Thu, 29 Jan 2026 18:30:04 +0100 Subject: [PATCH 1/7] Added schema builders --- Unity/Assets/Json/Builders.meta | 3 ++ Unity/Assets/Json/Builders/ArrayBuilder.cs | 36 +++++++++++++++++++ .../Assets/Json/Builders/ArrayBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/BooleanBuilder.cs | 10 ++++++ .../Json/Builders/BooleanBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/FloatBuilder.cs | 10 ++++++ .../Assets/Json/Builders/FloatBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/IntegerBuilder.cs | 10 ++++++ .../Json/Builders/IntegerBuilder.cs.meta | 3 ++ .../Json/Builders/JsonSchemaBuilders.cs | 18 ++++++++++ .../Json/Builders/JsonSchemaBuilders.cs.meta | 3 ++ Unity/Assets/Json/Builders/NullBuilder.cs | 11 ++++++ .../Assets/Json/Builders/NullBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/NumberBuilder.cs | 32 +++++++++++++++++ .../Json/Builders/NumberBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/ObjectBuilder.cs | 29 +++++++++++++++ .../Json/Builders/ObjectBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/SchemaBuilder.cs | 24 +++++++++++++ .../Json/Builders/SchemaBuilder.cs.meta | 3 ++ Unity/Assets/Json/Builders/StringBuilder.cs | 28 +++++++++++++++ .../Json/Builders/StringBuilder.cs.meta | 3 ++ Unity/Assets/Json/QJS.cs | 5 ++- 22 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 Unity/Assets/Json/Builders.meta create mode 100644 Unity/Assets/Json/Builders/ArrayBuilder.cs create mode 100644 Unity/Assets/Json/Builders/ArrayBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/BooleanBuilder.cs create mode 100644 Unity/Assets/Json/Builders/BooleanBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/FloatBuilder.cs create mode 100644 Unity/Assets/Json/Builders/FloatBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/IntegerBuilder.cs create mode 100644 Unity/Assets/Json/Builders/IntegerBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/JsonSchemaBuilders.cs create mode 100644 Unity/Assets/Json/Builders/JsonSchemaBuilders.cs.meta create mode 100644 Unity/Assets/Json/Builders/NullBuilder.cs create mode 100644 Unity/Assets/Json/Builders/NullBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/NumberBuilder.cs create mode 100644 Unity/Assets/Json/Builders/NumberBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/ObjectBuilder.cs create mode 100644 Unity/Assets/Json/Builders/ObjectBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/SchemaBuilder.cs create mode 100644 Unity/Assets/Json/Builders/SchemaBuilder.cs.meta create mode 100644 Unity/Assets/Json/Builders/StringBuilder.cs create mode 100644 Unity/Assets/Json/Builders/StringBuilder.cs.meta diff --git a/Unity/Assets/Json/Builders.meta b/Unity/Assets/Json/Builders.meta new file mode 100644 index 0000000..3caa246 --- /dev/null +++ b/Unity/Assets/Json/Builders.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 421f1a31845b41e583b2e79a92788f17 +timeCreated: 1769705709 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs b/Unity/Assets/Json/Builders/ArrayBuilder.cs new file mode 100644 index 0000000..c3388f3 --- /dev/null +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs @@ -0,0 +1,36 @@ +using System; + +namespace NeuroSdk.Json.Builders +{ + public sealed class ArrayBuilder : SchemaBuilder + { + public ArrayBuilder() + { + Schema.Type = JsonSchemaType.Array; + } + + public ArrayBuilder Items(Func build) + { + Schema.Items = build().Build(); + return this; + } + + public ArrayBuilder MinItems(int value) + { + Schema.MinItems = value; + return this; + } + + public ArrayBuilder MaxItems(int value) + { + Schema.MaxItems = value; + return this; + } + + public ArrayBuilder UniqueItems(bool value = true) + { + Schema.UniqueItems = value; + return this; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs.meta b/Unity/Assets/Json/Builders/ArrayBuilder.cs.meta new file mode 100644 index 0000000..a930d58 --- /dev/null +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0646c51c54f045bb8f72b78cdd60757e +timeCreated: 1769706057 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/BooleanBuilder.cs b/Unity/Assets/Json/Builders/BooleanBuilder.cs new file mode 100644 index 0000000..1405ff7 --- /dev/null +++ b/Unity/Assets/Json/Builders/BooleanBuilder.cs @@ -0,0 +1,10 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class BooleanBuilder : SchemaBuilder + { + public BooleanBuilder() + { + Schema.Type = JsonSchemaType.Boolean; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/BooleanBuilder.cs.meta b/Unity/Assets/Json/Builders/BooleanBuilder.cs.meta new file mode 100644 index 0000000..9dc3be2 --- /dev/null +++ b/Unity/Assets/Json/Builders/BooleanBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2491c82c290d4be1980ed585300b8aa8 +timeCreated: 1769706451 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/FloatBuilder.cs b/Unity/Assets/Json/Builders/FloatBuilder.cs new file mode 100644 index 0000000..ec71ecc --- /dev/null +++ b/Unity/Assets/Json/Builders/FloatBuilder.cs @@ -0,0 +1,10 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class FloatBuilder : NumberBuilder + { + public FloatBuilder() + { + Schema.Type = JsonSchemaType.Float; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/FloatBuilder.cs.meta b/Unity/Assets/Json/Builders/FloatBuilder.cs.meta new file mode 100644 index 0000000..17358f7 --- /dev/null +++ b/Unity/Assets/Json/Builders/FloatBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f5761a21033646438267a0a1c003c5d3 +timeCreated: 1769706422 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/IntegerBuilder.cs b/Unity/Assets/Json/Builders/IntegerBuilder.cs new file mode 100644 index 0000000..2a903fb --- /dev/null +++ b/Unity/Assets/Json/Builders/IntegerBuilder.cs @@ -0,0 +1,10 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class IntegerBuilder : NumberBuilder + { + public IntegerBuilder() + { + Schema.Type = JsonSchemaType.Integer; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/IntegerBuilder.cs.meta b/Unity/Assets/Json/Builders/IntegerBuilder.cs.meta new file mode 100644 index 0000000..9d1f4d0 --- /dev/null +++ b/Unity/Assets/Json/Builders/IntegerBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3c5b3ec78e004a918d35fecc70e9e34d +timeCreated: 1769706309 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs new file mode 100644 index 0000000..acd140d --- /dev/null +++ b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs @@ -0,0 +1,18 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class JsonSchemaBuilders + { + public static JsonSchemaBuilders Instance { get; } = new(); + + private JsonSchemaBuilders() {} + + public ObjectBuilder Object() => new(); + public ArrayBuilder Array() => new(); + public StringBuilder String() => new(); + public IntegerBuilder Integer() => new(); + public FloatBuilder Float() => new(); + public BooleanBuilder Boolean() => new(); + public NullBuilder Null() => new(); + } + +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs.meta b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs.meta new file mode 100644 index 0000000..bf8b6c3 --- /dev/null +++ b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 634f56096f714031a8d9693680f2cc82 +timeCreated: 1769707387 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/NullBuilder.cs b/Unity/Assets/Json/Builders/NullBuilder.cs new file mode 100644 index 0000000..8f0a4e4 --- /dev/null +++ b/Unity/Assets/Json/Builders/NullBuilder.cs @@ -0,0 +1,11 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class NullBuilder : SchemaBuilder + { + public NullBuilder() + { + Schema.Type = JsonSchemaType.Null; + Schema.Const = null; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/NullBuilder.cs.meta b/Unity/Assets/Json/Builders/NullBuilder.cs.meta new file mode 100644 index 0000000..e0492ac --- /dev/null +++ b/Unity/Assets/Json/Builders/NullBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: adbf731825984f4a9018c6821d104541 +timeCreated: 1769706539 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs b/Unity/Assets/Json/Builders/NumberBuilder.cs new file mode 100644 index 0000000..bf5cc9c --- /dev/null +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs @@ -0,0 +1,32 @@ +namespace NeuroSdk.Json.Builders +{ + public abstract class NumberBuilder : SchemaBuilder + where TSelf : NumberBuilder + { + protected TSelf Self => (TSelf)this; + + public TSelf Min(double value) + { + Schema.Minimum = (float)value; + return Self; + } + + public TSelf Max(double value) + { + Schema.Maximum = (float)value; + return Self; + } + + public TSelf ExclusiveMin(double value) + { + Schema.ExclusiveMinimum = (float)value; + return Self; + } + + public TSelf ExclusiveMax(double value) + { + Schema.ExclusiveMaximum = (float)value; + return Self; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs.meta b/Unity/Assets/Json/Builders/NumberBuilder.cs.meta new file mode 100644 index 0000000..3c614c2 --- /dev/null +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9244035db93c4c13b8f830240f47befe +timeCreated: 1769706268 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs b/Unity/Assets/Json/Builders/ObjectBuilder.cs new file mode 100644 index 0000000..493d40f --- /dev/null +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace NeuroSdk.Json.Builders +{ + public sealed class ObjectBuilder : SchemaBuilder + { + public ObjectBuilder() + { + Schema.Type = JsonSchemaType.Object; + Schema.Properties = new Dictionary(); + } + + public ObjectBuilder Property( + string name, + Func build, + bool required = true) + { + var subBuilder = build(JsonSchemaBuilders.Instance); + Schema.Properties[name] = subBuilder.Build(); + + if (required) + Schema.Required.Add(name); + + return this; + } + + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs.meta b/Unity/Assets/Json/Builders/ObjectBuilder.cs.meta new file mode 100644 index 0000000..9456f85 --- /dev/null +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ba10521db3994aaa839cf2450bfa2ae9 +timeCreated: 1769705803 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs b/Unity/Assets/Json/Builders/SchemaBuilder.cs new file mode 100644 index 0000000..1f276f7 --- /dev/null +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using System.Linq; + +namespace NeuroSdk.Json.Builders +{ + public class SchemaBuilder + { + protected readonly JsonSchema Schema = new(); + + public JsonSchema Build() => Schema; + + public SchemaBuilder Const(object value) + { + Schema.Const = value; + return this; + } + + public SchemaBuilder Enum(IEnumerable values) + { + Schema.Enum = values.ToList(); + return this; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs.meta b/Unity/Assets/Json/Builders/SchemaBuilder.cs.meta new file mode 100644 index 0000000..bcbccdc --- /dev/null +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e61ee01018d419f9fccf8af4aa8aba7 +timeCreated: 1769705721 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs b/Unity/Assets/Json/Builders/StringBuilder.cs new file mode 100644 index 0000000..4191e7d --- /dev/null +++ b/Unity/Assets/Json/Builders/StringBuilder.cs @@ -0,0 +1,28 @@ +namespace NeuroSdk.Json.Builders +{ + public sealed class StringBuilder : SchemaBuilder + { + public StringBuilder() + { + Schema.Type = JsonSchemaType.String; + } + + public StringBuilder MinLength(int value) + { + Schema.MinLength = value; + return this; + } + + public StringBuilder MaxLength(int value) + { + Schema.MaxLength = value; + return this; + } + + public StringBuilder Pattern(string regex) + { + Schema.Pattern = regex; + return this; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs.meta b/Unity/Assets/Json/Builders/StringBuilder.cs.meta new file mode 100644 index 0000000..494dd81 --- /dev/null +++ b/Unity/Assets/Json/Builders/StringBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5e4f5688ef794ad084f3e09fb0e4a80b +timeCreated: 1769706126 \ No newline at end of file diff --git a/Unity/Assets/Json/QJS.cs b/Unity/Assets/Json/QJS.cs index d61504f..aef8f58 100644 --- a/Unity/Assets/Json/QJS.cs +++ b/Unity/Assets/Json/QJS.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; +using NeuroSdk.Json.Builders; namespace NeuroSdk.Json { @@ -64,5 +65,7 @@ public static JsonSchema WrapObject(IReadOnlyDictionary prop return result; } + + public static JsonSchemaBuilders Builder => JsonSchemaBuilders.Instance; } -} +} \ No newline at end of file From 4e0c4f37d37d9b48745c16cb097c49f87a125b69 Mon Sep 17 00:00:00 2001 From: Thorminate Date: Thu, 29 Jan 2026 19:40:53 +0100 Subject: [PATCH 2/7] improved enums --- Unity/Assets/Json/Builders/ArrayBuilder.cs | 7 ++++--- Unity/Assets/Json/Builders/BooleanBuilder.cs | 2 +- Unity/Assets/Json/Builders/NullBuilder.cs | 2 +- Unity/Assets/Json/Builders/NumberBuilder.cs | 2 +- Unity/Assets/Json/Builders/ObjectBuilder.cs | 6 +++--- Unity/Assets/Json/Builders/SchemaBuilder.cs | 8 ++++---- Unity/Assets/Json/Builders/StringBuilder.cs | 2 +- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs b/Unity/Assets/Json/Builders/ArrayBuilder.cs index c3388f3..89311b2 100644 --- a/Unity/Assets/Json/Builders/ArrayBuilder.cs +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs @@ -1,17 +1,18 @@ using System; +using System.Collections.Generic; namespace NeuroSdk.Json.Builders { - public sealed class ArrayBuilder : SchemaBuilder + public sealed class ArrayBuilder : SchemaBuilder> { public ArrayBuilder() { Schema.Type = JsonSchemaType.Array; } - public ArrayBuilder Items(Func build) + public ArrayBuilder Items(Func> build) { - Schema.Items = build().Build(); + Schema.Items = build(JsonSchemaBuilders.Instance).Build(); return this; } diff --git a/Unity/Assets/Json/Builders/BooleanBuilder.cs b/Unity/Assets/Json/Builders/BooleanBuilder.cs index 1405ff7..4338b57 100644 --- a/Unity/Assets/Json/Builders/BooleanBuilder.cs +++ b/Unity/Assets/Json/Builders/BooleanBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class BooleanBuilder : SchemaBuilder + public sealed class BooleanBuilder : SchemaBuilder { public BooleanBuilder() { diff --git a/Unity/Assets/Json/Builders/NullBuilder.cs b/Unity/Assets/Json/Builders/NullBuilder.cs index 8f0a4e4..8ca3edf 100644 --- a/Unity/Assets/Json/Builders/NullBuilder.cs +++ b/Unity/Assets/Json/Builders/NullBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class NullBuilder : SchemaBuilder + public sealed class NullBuilder : SchemaBuilder { public NullBuilder() { diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs b/Unity/Assets/Json/Builders/NumberBuilder.cs index bf5cc9c..46cbde1 100644 --- a/Unity/Assets/Json/Builders/NumberBuilder.cs +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public abstract class NumberBuilder : SchemaBuilder + public abstract class NumberBuilder : SchemaBuilder where TSelf : NumberBuilder { protected TSelf Self => (TSelf)this; diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs b/Unity/Assets/Json/Builders/ObjectBuilder.cs index 493d40f..cc0a2cc 100644 --- a/Unity/Assets/Json/Builders/ObjectBuilder.cs +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs @@ -3,7 +3,7 @@ namespace NeuroSdk.Json.Builders { - public sealed class ObjectBuilder : SchemaBuilder + public sealed class ObjectBuilder : SchemaBuilder { public ObjectBuilder() { @@ -11,9 +11,9 @@ public ObjectBuilder() Schema.Properties = new Dictionary(); } - public ObjectBuilder Property( + public ObjectBuilder Property( string name, - Func build, + Func> build, bool required = true) { var subBuilder = build(JsonSchemaBuilders.Instance); diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs b/Unity/Assets/Json/Builders/SchemaBuilder.cs index 1f276f7..2583343 100644 --- a/Unity/Assets/Json/Builders/SchemaBuilder.cs +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs @@ -3,21 +3,21 @@ namespace NeuroSdk.Json.Builders { - public class SchemaBuilder + public class SchemaBuilder { protected readonly JsonSchema Schema = new(); public JsonSchema Build() => Schema; - public SchemaBuilder Const(object value) + public SchemaBuilder Const(object value) { Schema.Const = value; return this; } - public SchemaBuilder Enum(IEnumerable values) + public SchemaBuilder Enum(params THolds[] values) { - Schema.Enum = values.ToList(); + Schema.Enum = values.Cast().ToList(); return this; } } diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs b/Unity/Assets/Json/Builders/StringBuilder.cs index 4191e7d..114643d 100644 --- a/Unity/Assets/Json/Builders/StringBuilder.cs +++ b/Unity/Assets/Json/Builders/StringBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class StringBuilder : SchemaBuilder + public sealed class StringBuilder : SchemaBuilder { public StringBuilder() { From d0cdaad5789c981f496c1e69a0d924ce6c5b8d27 Mon Sep 17 00:00:00 2001 From: Thorminate Date: Thu, 29 Jan 2026 21:55:04 +0100 Subject: [PATCH 3/7] Restrict JsonSchemaBuilders to only Array and Object. --- Unity/Assets/Json/Builders/ArrayBuilder.cs | 2 +- Unity/Assets/Json/Builders/JsonSchemaBuilders.cs | 13 ++++++++++--- Unity/Assets/Json/Builders/ObjectBuilder.cs | 2 +- Unity/Assets/Json/QJS.cs | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs b/Unity/Assets/Json/Builders/ArrayBuilder.cs index 89311b2..9080740 100644 --- a/Unity/Assets/Json/Builders/ArrayBuilder.cs +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs @@ -12,7 +12,7 @@ public ArrayBuilder() public ArrayBuilder Items(Func> build) { - Schema.Items = build(JsonSchemaBuilders.Instance).Build(); + Schema.Items = build(new JsonSchemaBuilders()).Build(); return this; } diff --git a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs index acd140d..526c413 100644 --- a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs +++ b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs @@ -1,10 +1,17 @@ namespace NeuroSdk.Json.Builders { - public sealed class JsonSchemaBuilders + public interface IRootSchemaBuilders { - public static JsonSchemaBuilders Instance { get; } = new(); + ObjectBuilder Object(); + ArrayBuilder Array(); + } + + public sealed class JsonSchemaBuilders : IRootSchemaBuilders + { + // singleton schizophrenia xd + public static IRootSchemaBuilders Instance { get; } = new JsonSchemaBuilders(); - private JsonSchemaBuilders() {} + internal JsonSchemaBuilders() {} public ObjectBuilder Object() => new(); public ArrayBuilder Array() => new(); diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs b/Unity/Assets/Json/Builders/ObjectBuilder.cs index cc0a2cc..737424c 100644 --- a/Unity/Assets/Json/Builders/ObjectBuilder.cs +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs @@ -16,7 +16,7 @@ public ObjectBuilder Property( Func> build, bool required = true) { - var subBuilder = build(JsonSchemaBuilders.Instance); + var subBuilder = build(new JsonSchemaBuilders()); Schema.Properties[name] = subBuilder.Build(); if (required) diff --git a/Unity/Assets/Json/QJS.cs b/Unity/Assets/Json/QJS.cs index aef8f58..1d1e59c 100644 --- a/Unity/Assets/Json/QJS.cs +++ b/Unity/Assets/Json/QJS.cs @@ -66,6 +66,6 @@ public static JsonSchema WrapObject(IReadOnlyDictionary prop return result; } - public static JsonSchemaBuilders Builder => JsonSchemaBuilders.Instance; + public static IRootSchemaBuilders Builder => JsonSchemaBuilders.Instance; } } \ No newline at end of file From a7f185eace6487bd84912b263bf1d5189680f17b Mon Sep 17 00:00:00 2001 From: Thorminate Date: Fri, 30 Jan 2026 10:18:18 +0100 Subject: [PATCH 4/7] use floats in the NumberBuilder range setters --- Unity/Assets/Json/Builders/NumberBuilder.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs b/Unity/Assets/Json/Builders/NumberBuilder.cs index 46cbde1..86186de 100644 --- a/Unity/Assets/Json/Builders/NumberBuilder.cs +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs @@ -5,28 +5,28 @@ public abstract class NumberBuilder : SchemaBuilder { protected TSelf Self => (TSelf)this; - public TSelf Min(double value) + public TSelf Min(float value) { - Schema.Minimum = (float)value; + Schema.Minimum = value; return Self; } - public TSelf Max(double value) + public TSelf Max(float value) { - Schema.Maximum = (float)value; + Schema.Maximum = value; return Self; } - public TSelf ExclusiveMin(double value) + public TSelf ExclusiveMin(float value) { - Schema.ExclusiveMinimum = (float)value; + Schema.ExclusiveMinimum = value; return Self; } - public TSelf ExclusiveMax(double value) + public TSelf ExclusiveMax(float value) { - Schema.ExclusiveMaximum = (float)value; + Schema.ExclusiveMaximum = value; return Self; } } -} \ No newline at end of file +} From f9406db948bfa38e952f3fbb7e3d96e4cc7b8939 Mon Sep 17 00:00:00 2001 From: Thorminate Date: Fri, 30 Jan 2026 17:21:50 +0100 Subject: [PATCH 5/7] Cleaned up enum typing and the array builder --- Unity/Assets/Json/Builders/ArrayBuilder.cs | 9 ++------- Unity/Assets/Json/Builders/BooleanBuilder.cs | 2 +- Unity/Assets/Json/Builders/FloatBuilder.cs | 2 +- Unity/Assets/Json/Builders/IntegerBuilder.cs | 2 +- .../Json/Builders/JsonSchemaBuilders.cs | 8 +++++--- Unity/Assets/Json/Builders/NullBuilder.cs | 2 +- Unity/Assets/Json/Builders/NumberBuilder.cs | 4 ++-- Unity/Assets/Json/Builders/ObjectBuilder.cs | 6 +++--- .../Assets/Json/Builders/PrimitiveBuilder.cs | 19 +++++++++++++++++++ .../Json/Builders/PrimitiveBuilder.cs.meta | 3 +++ Unity/Assets/Json/Builders/SchemaBuilder.cs | 19 ++----------------- Unity/Assets/Json/Builders/StringBuilder.cs | 2 +- 12 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 Unity/Assets/Json/Builders/PrimitiveBuilder.cs create mode 100644 Unity/Assets/Json/Builders/PrimitiveBuilder.cs.meta diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs b/Unity/Assets/Json/Builders/ArrayBuilder.cs index 9080740..cbd1dcf 100644 --- a/Unity/Assets/Json/Builders/ArrayBuilder.cs +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs @@ -3,17 +3,12 @@ namespace NeuroSdk.Json.Builders { - public sealed class ArrayBuilder : SchemaBuilder> + public sealed class ArrayBuilder : SchemaBuilder { - public ArrayBuilder() + public ArrayBuilder(Func build) { Schema.Type = JsonSchemaType.Array; - } - - public ArrayBuilder Items(Func> build) - { Schema.Items = build(new JsonSchemaBuilders()).Build(); - return this; } public ArrayBuilder MinItems(int value) diff --git a/Unity/Assets/Json/Builders/BooleanBuilder.cs b/Unity/Assets/Json/Builders/BooleanBuilder.cs index 4338b57..3e4d343 100644 --- a/Unity/Assets/Json/Builders/BooleanBuilder.cs +++ b/Unity/Assets/Json/Builders/BooleanBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class BooleanBuilder : SchemaBuilder + public sealed class BooleanBuilder : PrimitiveBuilder { public BooleanBuilder() { diff --git a/Unity/Assets/Json/Builders/FloatBuilder.cs b/Unity/Assets/Json/Builders/FloatBuilder.cs index ec71ecc..ecb33d2 100644 --- a/Unity/Assets/Json/Builders/FloatBuilder.cs +++ b/Unity/Assets/Json/Builders/FloatBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class FloatBuilder : NumberBuilder + public sealed class FloatBuilder : NumberBuilder { public FloatBuilder() { diff --git a/Unity/Assets/Json/Builders/IntegerBuilder.cs b/Unity/Assets/Json/Builders/IntegerBuilder.cs index 2a903fb..8ab3168 100644 --- a/Unity/Assets/Json/Builders/IntegerBuilder.cs +++ b/Unity/Assets/Json/Builders/IntegerBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class IntegerBuilder : NumberBuilder + public sealed class IntegerBuilder : NumberBuilder { public IntegerBuilder() { diff --git a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs index 526c413..3cc997a 100644 --- a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs +++ b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs @@ -1,9 +1,11 @@ -namespace NeuroSdk.Json.Builders +using System; + +namespace NeuroSdk.Json.Builders { public interface IRootSchemaBuilders { ObjectBuilder Object(); - ArrayBuilder Array(); + ArrayBuilder Array(Func build); } public sealed class JsonSchemaBuilders : IRootSchemaBuilders @@ -14,7 +16,7 @@ public sealed class JsonSchemaBuilders : IRootSchemaBuilders internal JsonSchemaBuilders() {} public ObjectBuilder Object() => new(); - public ArrayBuilder Array() => new(); + public ArrayBuilder Array(Func build) => new(build); public StringBuilder String() => new(); public IntegerBuilder Integer() => new(); public FloatBuilder Float() => new(); diff --git a/Unity/Assets/Json/Builders/NullBuilder.cs b/Unity/Assets/Json/Builders/NullBuilder.cs index 8ca3edf..6ed9e04 100644 --- a/Unity/Assets/Json/Builders/NullBuilder.cs +++ b/Unity/Assets/Json/Builders/NullBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class NullBuilder : SchemaBuilder + public sealed class NullBuilder : PrimitiveBuilder { public NullBuilder() { diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs b/Unity/Assets/Json/Builders/NumberBuilder.cs index 86186de..a6e986e 100644 --- a/Unity/Assets/Json/Builders/NumberBuilder.cs +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs @@ -1,7 +1,7 @@ namespace NeuroSdk.Json.Builders { - public abstract class NumberBuilder : SchemaBuilder - where TSelf : NumberBuilder + public abstract class NumberBuilder : PrimitiveBuilder + where TSelf : NumberBuilder { protected TSelf Self => (TSelf)this; diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs b/Unity/Assets/Json/Builders/ObjectBuilder.cs index 737424c..a9a30e5 100644 --- a/Unity/Assets/Json/Builders/ObjectBuilder.cs +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs @@ -3,7 +3,7 @@ namespace NeuroSdk.Json.Builders { - public sealed class ObjectBuilder : SchemaBuilder + public sealed class ObjectBuilder : SchemaBuilder { public ObjectBuilder() { @@ -11,9 +11,9 @@ public ObjectBuilder() Schema.Properties = new Dictionary(); } - public ObjectBuilder Property( + public ObjectBuilder Property( string name, - Func> build, + Func build, bool required = true) { var subBuilder = build(new JsonSchemaBuilders()); diff --git a/Unity/Assets/Json/Builders/PrimitiveBuilder.cs b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs new file mode 100644 index 0000000..80d6a30 --- /dev/null +++ b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs @@ -0,0 +1,19 @@ +using System.Linq; + +namespace NeuroSdk.Json.Builders +{ + public class PrimitiveBuilder : SchemaBuilder + { + public PrimitiveBuilder Const(THolds value) + { + Schema.Const = value; + return this; + } + + public PrimitiveBuilder Enum(params THolds[] values) + { + Schema.Enum = values.Cast().ToList(); + return this; + } + } +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/PrimitiveBuilder.cs.meta b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs.meta new file mode 100644 index 0000000..87219f7 --- /dev/null +++ b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2c36fd8332b240dc9c103ea7cba1603f +timeCreated: 1769789104 \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs b/Unity/Assets/Json/Builders/SchemaBuilder.cs index 2583343..1d89692 100644 --- a/Unity/Assets/Json/Builders/SchemaBuilder.cs +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs @@ -1,24 +1,9 @@ -using System.Collections.Generic; -using System.Linq; - -namespace NeuroSdk.Json.Builders +namespace NeuroSdk.Json.Builders { - public class SchemaBuilder + public class SchemaBuilder { protected readonly JsonSchema Schema = new(); public JsonSchema Build() => Schema; - - public SchemaBuilder Const(object value) - { - Schema.Const = value; - return this; - } - - public SchemaBuilder Enum(params THolds[] values) - { - Schema.Enum = values.Cast().ToList(); - return this; - } } } \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs b/Unity/Assets/Json/Builders/StringBuilder.cs index 114643d..6a59e3b 100644 --- a/Unity/Assets/Json/Builders/StringBuilder.cs +++ b/Unity/Assets/Json/Builders/StringBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class StringBuilder : SchemaBuilder + public sealed class StringBuilder : PrimitiveBuilder { public StringBuilder() { From edadf097fbc127cd688b6a2172369413b0d0354b Mon Sep 17 00:00:00 2001 From: Thorminate Date: Wed, 4 Feb 2026 17:47:39 +0100 Subject: [PATCH 6/7] Reworked the optional handling --- Unity/Assets/Json/Builders/ArrayBuilder.cs | 12 ++--- Unity/Assets/Json/Builders/BooleanBuilder.cs | 2 +- .../Json/Builders/JsonSchemaBuilders.cs | 51 +++++++++++++++---- Unity/Assets/Json/Builders/NullBuilder.cs | 2 +- Unity/Assets/Json/Builders/NumberBuilder.cs | 6 +-- Unity/Assets/Json/Builders/ObjectBuilder.cs | 11 ++-- .../Assets/Json/Builders/PrimitiveBuilder.cs | 11 ++-- Unity/Assets/Json/Builders/SchemaBuilder.cs | 16 +++++- Unity/Assets/Json/Builders/StringBuilder.cs | 2 +- 9 files changed, 75 insertions(+), 38 deletions(-) diff --git a/Unity/Assets/Json/Builders/ArrayBuilder.cs b/Unity/Assets/Json/Builders/ArrayBuilder.cs index cbd1dcf..508b92f 100644 --- a/Unity/Assets/Json/Builders/ArrayBuilder.cs +++ b/Unity/Assets/Json/Builders/ArrayBuilder.cs @@ -1,29 +1,29 @@ using System; -using System.Collections.Generic; namespace NeuroSdk.Json.Builders { - public sealed class ArrayBuilder : SchemaBuilder + public sealed class ArrayBuilder : SchemaBuilder> + where TItems : SchemaBuilder { - public ArrayBuilder(Func build) + public ArrayBuilder(Func> build) { Schema.Type = JsonSchemaType.Array; Schema.Items = build(new JsonSchemaBuilders()).Build(); } - public ArrayBuilder MinItems(int value) + public ArrayBuilder MinItems(int value) { Schema.MinItems = value; return this; } - public ArrayBuilder MaxItems(int value) + public ArrayBuilder MaxItems(int value) { Schema.MaxItems = value; return this; } - public ArrayBuilder UniqueItems(bool value = true) + public ArrayBuilder UniqueItems(bool value = true) { Schema.UniqueItems = value; return this; diff --git a/Unity/Assets/Json/Builders/BooleanBuilder.cs b/Unity/Assets/Json/Builders/BooleanBuilder.cs index 3e4d343..e6a14c5 100644 --- a/Unity/Assets/Json/Builders/BooleanBuilder.cs +++ b/Unity/Assets/Json/Builders/BooleanBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class BooleanBuilder : PrimitiveBuilder + public sealed class BooleanBuilder : PrimitiveBuilder { public BooleanBuilder() { diff --git a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs index 3cc997a..83af15d 100644 --- a/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs +++ b/Unity/Assets/Json/Builders/JsonSchemaBuilders.cs @@ -5,23 +5,52 @@ namespace NeuroSdk.Json.Builders public interface IRootSchemaBuilders { ObjectBuilder Object(); - ArrayBuilder Array(Func build); + ArrayBuilder Array(Func> build) where T : SchemaBuilder; } - + public sealed class JsonSchemaBuilders : IRootSchemaBuilders { + internal JsonSchemaBuilders() + { + } + // singleton schizophrenia xd public static IRootSchemaBuilders Instance { get; } = new JsonSchemaBuilders(); - internal JsonSchemaBuilders() {} + public ObjectBuilder Object() + { + return new ObjectBuilder(); + } - public ObjectBuilder Object() => new(); - public ArrayBuilder Array(Func build) => new(build); - public StringBuilder String() => new(); - public IntegerBuilder Integer() => new(); - public FloatBuilder Float() => new(); - public BooleanBuilder Boolean() => new(); - public NullBuilder Null() => new(); - } + public ArrayBuilder Array(Func> build) + where T : SchemaBuilder + { + return new ArrayBuilder(build); + } + + public StringBuilder String() + { + return new StringBuilder(); + } + public IntegerBuilder Integer() + { + return new IntegerBuilder(); + } + + public FloatBuilder Float() + { + return new FloatBuilder(); + } + + public BooleanBuilder Boolean() + { + return new BooleanBuilder(); + } + + public NullBuilder Null() + { + return new NullBuilder(); + } + } } \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/NullBuilder.cs b/Unity/Assets/Json/Builders/NullBuilder.cs index 6ed9e04..cb5f612 100644 --- a/Unity/Assets/Json/Builders/NullBuilder.cs +++ b/Unity/Assets/Json/Builders/NullBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class NullBuilder : PrimitiveBuilder + public sealed class NullBuilder : PrimitiveBuilder { public NullBuilder() { diff --git a/Unity/Assets/Json/Builders/NumberBuilder.cs b/Unity/Assets/Json/Builders/NumberBuilder.cs index a6e986e..291aa37 100644 --- a/Unity/Assets/Json/Builders/NumberBuilder.cs +++ b/Unity/Assets/Json/Builders/NumberBuilder.cs @@ -1,10 +1,8 @@ namespace NeuroSdk.Json.Builders { - public abstract class NumberBuilder : PrimitiveBuilder + public abstract class NumberBuilder : PrimitiveBuilder where TSelf : NumberBuilder { - protected TSelf Self => (TSelf)this; - public TSelf Min(float value) { Schema.Minimum = value; @@ -29,4 +27,4 @@ public TSelf ExclusiveMax(float value) return Self; } } -} +} \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/ObjectBuilder.cs b/Unity/Assets/Json/Builders/ObjectBuilder.cs index a9a30e5..56ef889 100644 --- a/Unity/Assets/Json/Builders/ObjectBuilder.cs +++ b/Unity/Assets/Json/Builders/ObjectBuilder.cs @@ -3,7 +3,7 @@ namespace NeuroSdk.Json.Builders { - public sealed class ObjectBuilder : SchemaBuilder + public sealed class ObjectBuilder : SchemaBuilder { public ObjectBuilder() { @@ -11,19 +11,16 @@ public ObjectBuilder() Schema.Properties = new Dictionary(); } - public ObjectBuilder Property( + public ObjectBuilder Property( string name, - Func build, - bool required = true) + Func> build) where T : SchemaBuilder { var subBuilder = build(new JsonSchemaBuilders()); Schema.Properties[name] = subBuilder.Build(); - if (required) - Schema.Required.Add(name); + if (!subBuilder.IsOptional) Schema.Required.Add(name); return this; } - } } \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/PrimitiveBuilder.cs b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs index 80d6a30..29d7e29 100644 --- a/Unity/Assets/Json/Builders/PrimitiveBuilder.cs +++ b/Unity/Assets/Json/Builders/PrimitiveBuilder.cs @@ -2,18 +2,19 @@ namespace NeuroSdk.Json.Builders { - public class PrimitiveBuilder : SchemaBuilder + public class PrimitiveBuilder : SchemaBuilder + where TSelf : PrimitiveBuilder { - public PrimitiveBuilder Const(THolds value) + public TSelf Const(THolds value) { Schema.Const = value; - return this; + return Self; } - public PrimitiveBuilder Enum(params THolds[] values) + public TSelf Enum(params THolds[] values) { Schema.Enum = values.Cast().ToList(); - return this; + return Self; } } } \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs b/Unity/Assets/Json/Builders/SchemaBuilder.cs index 1d89692..7dd829d 100644 --- a/Unity/Assets/Json/Builders/SchemaBuilder.cs +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs @@ -1,9 +1,21 @@ namespace NeuroSdk.Json.Builders { - public class SchemaBuilder + public class SchemaBuilder where TSelf : SchemaBuilder { protected readonly JsonSchema Schema = new(); + protected TSelf Self => (TSelf)this; - public JsonSchema Build() => Schema; + internal bool IsOptional { get; private set; } + + public TSelf Optional() + { + IsOptional = true; + return Self; + } + + public JsonSchema Build() + { + return Schema; + } } } \ No newline at end of file diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs b/Unity/Assets/Json/Builders/StringBuilder.cs index 6a59e3b..34c90a1 100644 --- a/Unity/Assets/Json/Builders/StringBuilder.cs +++ b/Unity/Assets/Json/Builders/StringBuilder.cs @@ -1,6 +1,6 @@ namespace NeuroSdk.Json.Builders { - public sealed class StringBuilder : PrimitiveBuilder + public sealed class StringBuilder : PrimitiveBuilder { public StringBuilder() { From 66fb899501e5346c92951260e0fd0126bbd3d1d4 Mon Sep 17 00:00:00 2001 From: Thorminate Date: Wed, 4 Feb 2026 18:07:15 +0100 Subject: [PATCH 7/7] Add description field --- Unity/Assets/Json/Builders/SchemaBuilder.cs | 6 ++++++ Unity/Assets/Json/Builders/StringBuilder.cs | 10 +++++++++- Unity/Assets/Json/JsonSchema.cs | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Unity/Assets/Json/Builders/SchemaBuilder.cs b/Unity/Assets/Json/Builders/SchemaBuilder.cs index 7dd829d..52054ef 100644 --- a/Unity/Assets/Json/Builders/SchemaBuilder.cs +++ b/Unity/Assets/Json/Builders/SchemaBuilder.cs @@ -7,6 +7,12 @@ public class SchemaBuilder where TSelf : SchemaBuilder internal bool IsOptional { get; private set; } + public TSelf Description(string description) + { + Schema.Description = description; + return Self; + } + public TSelf Optional() { IsOptional = true; diff --git a/Unity/Assets/Json/Builders/StringBuilder.cs b/Unity/Assets/Json/Builders/StringBuilder.cs index 34c90a1..798b8f6 100644 --- a/Unity/Assets/Json/Builders/StringBuilder.cs +++ b/Unity/Assets/Json/Builders/StringBuilder.cs @@ -1,4 +1,6 @@ -namespace NeuroSdk.Json.Builders +using System.Text.RegularExpressions; + +namespace NeuroSdk.Json.Builders { public sealed class StringBuilder : PrimitiveBuilder { @@ -24,5 +26,11 @@ public StringBuilder Pattern(string regex) Schema.Pattern = regex; return this; } + + public StringBuilder Format(string format) + { + Schema.Format = format; + return this; + } } } \ No newline at end of file diff --git a/Unity/Assets/Json/JsonSchema.cs b/Unity/Assets/Json/JsonSchema.cs index 3612f0f..9cdc1b8 100644 --- a/Unity/Assets/Json/JsonSchema.cs +++ b/Unity/Assets/Json/JsonSchema.cs @@ -113,6 +113,9 @@ public List Required [JsonProperty("format")] public string? Format { get; set; } + + [JsonProperty("description")] + public string? Description { get; set; } #endregion