From 74295465dbcd74a9b782f662b440b97e881b19f5 Mon Sep 17 00:00:00 2001 From: Ilya Kozhemyakin Date: Sun, 11 May 2025 23:26:32 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D0=BF=D0=BE=D1=81=D1=82=D1=80=D0=BE=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8F=20=D1=81=D1=85=D0=B5=D0=BC=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs | 10 ++++----- .../SchemaBuilder/TypeResolver.cs | 22 +++---------------- .../SchemaBuilder/Types/AbstractSchemaType.cs | 2 +- .../SchemaBuilder/Types/ArraySchemaType.cs | 4 ++-- .../Types/DictionarySchemaType.cs | 4 ++-- .../SchemaBuilder/Types/ObjectSchemaType.cs | 17 +++++--------- .../SchemaBuilder/Types/StaticSchemaType.cs | 2 +- 7 files changed, 20 insertions(+), 41 deletions(-) diff --git a/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs b/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs index 454f681..cd7792f 100644 --- a/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs +++ b/Pf2eDataScrapper/SchemaBuilder/SchemaNode.cs @@ -63,7 +63,7 @@ internal class SchemaNode /// public SchemaNode() { - this.Root = true; + Root = true; } /// @@ -73,10 +73,10 @@ internal class SchemaNode /// Имя элемента. public SchemaNode(SchemaNode parent, string name) { - this.Parent = parent; - this.Name = name; - this.Path = parent.Path + "." + name; - this.Resolver = parent.Resolver; + Parent = parent; + Name = name; + Path = parent.Path + "." + name; + Resolver = parent.Resolver; } /// diff --git a/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs b/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs index d4709fd..b436c9d 100644 --- a/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs +++ b/Pf2eDataScrapper/SchemaBuilder/TypeResolver.cs @@ -24,9 +24,8 @@ internal class TypeResolver string[] pathParts = path.Split('.'); string[] nodeParts = node.Path.Split('.'); - return pathParts.Length > nodeParts.Length - ? false - : !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any(); + return pathParts.Length <= nodeParts.Length + && !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any(); } /// @@ -76,7 +75,7 @@ internal class TypeResolver /// Возникает, если у `value` значение идентично `null` /// (такие значения должны обрабаотываться в `SchemaNode`). /// - public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve) + public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve = false) { if (!disableResolve) { @@ -99,19 +98,4 @@ internal class TypeResolver _ => new StaticSchemaType(node, type), }; } - - /// - /// Определение типа поля. - /// - /// Поле схемы данных, для которого создаётся тип. - /// Добавляемое значение. - /// Новый тип для схемы данных - /// - /// Возникает, если у `value` значение идентично `null` - /// (такие значения должны обрабаотываться в `SchemaNode`). - /// - public AbstractSchemaType Resolve(SchemaNode node, JToken? value) - { - return this.Resolve(node, value, false); - } } diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs index ae55f5f..af83044 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/AbstractSchemaType.cs @@ -11,7 +11,7 @@ internal abstract class AbstractSchemaType(SchemaNode parent) /// /// Элемент схемы данных, к которому относится тип. /// - public SchemaNode Parent = parent; + public readonly SchemaNode Parent = parent; /// /// Корневой элемент схемы данных. diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/ArraySchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/ArraySchemaType.cs index f01cd12..3c928d5 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/ArraySchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/ArraySchemaType.cs @@ -21,7 +21,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent) /// /// Схема элемента массива. /// - protected SchemaNode ElementSchema = new(parent, "[]"); + protected readonly SchemaNode ElementSchema = new(parent, "[]"); /// /// Проверка, что значение совместимо с текущим типом. @@ -41,7 +41,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent) { if (value.Type != JTokenType.Array) { - throw new Exception("Value is not an array, did you forget to call IsCompatibleValue?"); + throw new("Value is not an array, did you forget to call IsCompatibleValue?"); } JArray array = (JArray)value; diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs index fe471f5..cce825d 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/DictionarySchemaType.cs @@ -11,12 +11,12 @@ internal class DictionarySchemaType(SchemaNode parent) : AbstractSchemaType(pare /// /// Схема ключей словаря. /// - public SchemaNode KeyNode = new(parent, "[key]"); + public readonly SchemaNode KeyNode = new(parent, "[key]"); /// /// Схема значений словаря. /// - public SchemaNode ItemNode = new(parent, "[value]"); + public readonly SchemaNode ItemNode = new(parent, "[value]"); /// /// Проверка, что значение совместимо с текущим типом. diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/ObjectSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/ObjectSchemaType.cs index 8abba41..e573405 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/ObjectSchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/ObjectSchemaType.cs @@ -11,7 +11,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent) /// /// Элемнты полей объекта. /// - public List Fields = []; + public readonly List Fields = []; /// /// Проверка, что значение совместимо с текущим типом. @@ -31,12 +31,9 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent) { JObject obj = (JObject)value; - foreach (SchemaNode field in Fields) + foreach (SchemaNode field in Fields.Where(field => !obj.ContainsKey(field.Name))) { - if (!obj.ContainsKey(field.Name)) - { - field.IsNullable = true; - } + field.IsNullable = true; } foreach (KeyValuePair pair in obj) @@ -45,7 +42,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent) if (field is null) { - field = new SchemaNode(Parent, pair.Key); + field = new(Parent, pair.Key); Fields.Add(field); } @@ -60,11 +57,9 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent) { Fields.Sort( (a, b) => - { - return a.IsNullable && !b.IsNullable + a.IsNullable && !b.IsNullable ? 0 - : string.Compare(a.Name, b.Name, StringComparison.Ordinal); - } + : string.Compare(a.Name, b.Name, StringComparison.Ordinal) ); foreach (SchemaNode field in Fields) diff --git a/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs b/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs index 6626713..76a5498 100644 --- a/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs +++ b/Pf2eDataScrapper/SchemaBuilder/Types/StaticSchemaType.cs @@ -12,7 +12,7 @@ internal class StaticSchemaType(SchemaNode parent, JTokenType type) : AbstractSc /// /// Тип значения. /// - protected JTokenType Type = type; + protected readonly JTokenType Type = type; /// /// Набор возможных значений и их количества.