Небольшой рефакторинг построителя схем данных.
This commit is contained in:
@@ -63,7 +63,7 @@ internal class SchemaNode
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode()
|
public SchemaNode()
|
||||||
{
|
{
|
||||||
this.Root = true;
|
Root = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -73,10 +73,10 @@ internal class SchemaNode
|
|||||||
/// <param name="name">Имя элемента.</param>
|
/// <param name="name">Имя элемента.</param>
|
||||||
public SchemaNode(SchemaNode parent, string name)
|
public SchemaNode(SchemaNode parent, string name)
|
||||||
{
|
{
|
||||||
this.Parent = parent;
|
Parent = parent;
|
||||||
this.Name = name;
|
Name = name;
|
||||||
this.Path = parent.Path + "." + name;
|
Path = parent.Path + "." + name;
|
||||||
this.Resolver = parent.Resolver;
|
Resolver = parent.Resolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -24,9 +24,8 @@ internal class TypeResolver
|
|||||||
string[] pathParts = path.Split('.');
|
string[] pathParts = path.Split('.');
|
||||||
string[] nodeParts = node.Path.Split('.');
|
string[] nodeParts = node.Path.Split('.');
|
||||||
|
|
||||||
return pathParts.Length > nodeParts.Length
|
return pathParts.Length <= nodeParts.Length
|
||||||
? false
|
&& !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any();
|
||||||
: !pathParts.Where((t, i) => t != "*" && t != nodeParts[i]).Any();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -76,7 +75,7 @@ internal class TypeResolver
|
|||||||
/// Возникает, если у `value` значение идентично `null`
|
/// Возникает, если у `value` значение идентично `null`
|
||||||
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
||||||
/// </exception>
|
/// </exception>
|
||||||
public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve)
|
public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve = false)
|
||||||
{
|
{
|
||||||
if (!disableResolve)
|
if (!disableResolve)
|
||||||
{
|
{
|
||||||
@@ -99,19 +98,4 @@ internal class TypeResolver
|
|||||||
_ => new StaticSchemaType(node, type),
|
_ => new StaticSchemaType(node, type),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Определение типа поля.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
|
|
||||||
/// <param name="value">Добавляемое значение.</param>
|
|
||||||
/// <returns>Новый тип для схемы данных</returns>
|
|
||||||
/// <exception cref="ArgumentNullException">
|
|
||||||
/// Возникает, если у `value` значение идентично `null`
|
|
||||||
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
|
||||||
/// </exception>
|
|
||||||
public AbstractSchemaType Resolve(SchemaNode node, JToken? value)
|
|
||||||
{
|
|
||||||
return this.Resolve(node, value, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ internal abstract class AbstractSchemaType(SchemaNode parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Элемент схемы данных, к которому относится тип.
|
/// Элемент схемы данных, к которому относится тип.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode Parent = parent;
|
public readonly SchemaNode Parent = parent;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Корневой элемент схемы данных.
|
/// Корневой элемент схемы данных.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема элемента массива.
|
/// Схема элемента массива.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected SchemaNode ElementSchema = new(parent, "[]");
|
protected readonly SchemaNode ElementSchema = new(parent, "[]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
@@ -41,7 +41,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
if (value.Type != JTokenType.Array)
|
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;
|
JArray array = (JArray)value;
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ internal class DictionarySchemaType(SchemaNode parent) : AbstractSchemaType(pare
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема ключей словаря.
|
/// Схема ключей словаря.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode KeyNode = new(parent, "[key]");
|
public readonly SchemaNode KeyNode = new(parent, "[key]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Схема значений словаря.
|
/// Схема значений словаря.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SchemaNode ItemNode = new(parent, "[value]");
|
public readonly SchemaNode ItemNode = new(parent, "[value]");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Элемнты полей объекта.
|
/// Элемнты полей объекта.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<SchemaNode> Fields = [];
|
public readonly List<SchemaNode> Fields = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверка, что значение совместимо с текущим типом.
|
/// Проверка, что значение совместимо с текущим типом.
|
||||||
@@ -31,13 +31,10 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
JObject obj = (JObject)value;
|
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<string, JToken?> pair in obj)
|
foreach (KeyValuePair<string, JToken?> pair in obj)
|
||||||
{
|
{
|
||||||
@@ -45,7 +42,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
|
|
||||||
if (field is null)
|
if (field is null)
|
||||||
{
|
{
|
||||||
field = new SchemaNode(Parent, pair.Key);
|
field = new(Parent, pair.Key);
|
||||||
Fields.Add(field);
|
Fields.Add(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,11 +57,9 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
|||||||
{
|
{
|
||||||
Fields.Sort(
|
Fields.Sort(
|
||||||
(a, b) =>
|
(a, b) =>
|
||||||
{
|
a.IsNullable && !b.IsNullable
|
||||||
return a.IsNullable && !b.IsNullable
|
|
||||||
? 0
|
? 0
|
||||||
: string.Compare(a.Name, b.Name, StringComparison.Ordinal);
|
: string.Compare(a.Name, b.Name, StringComparison.Ordinal)
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach (SchemaNode field in Fields)
|
foreach (SchemaNode field in Fields)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ internal class StaticSchemaType(SchemaNode parent, JTokenType type) : AbstractSc
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Тип значения.
|
/// Тип значения.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected JTokenType Type = type;
|
protected readonly JTokenType Type = type;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Набор возможных значений и их количества.
|
/// Набор возможных значений и их количества.
|
||||||
|
|||||||
Reference in New Issue
Block a user