Небольшой рефакторинг построителя схем данных.
This commit is contained in:
@@ -63,7 +63,7 @@ internal class SchemaNode
|
||||
/// </summary>
|
||||
public SchemaNode()
|
||||
{
|
||||
this.Root = true;
|
||||
Root = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -73,10 +73,10 @@ internal class SchemaNode
|
||||
/// <param name="name">Имя элемента.</param>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -76,7 +75,7 @@ internal class TypeResolver
|
||||
/// Возникает, если у `value` значение идентично `null`
|
||||
/// (такие значения должны обрабаотываться в `SchemaNode`).
|
||||
/// </exception>
|
||||
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),
|
||||
};
|
||||
}
|
||||
|
||||
/// <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>
|
||||
public SchemaNode Parent = parent;
|
||||
public readonly SchemaNode Parent = parent;
|
||||
|
||||
/// <summary>
|
||||
/// Корневой элемент схемы данных.
|
||||
|
||||
@@ -21,7 +21,7 @@ internal class ArraySchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
||||
/// <summary>
|
||||
/// Схема элемента массива.
|
||||
/// </summary>
|
||||
protected SchemaNode ElementSchema = new(parent, "[]");
|
||||
protected readonly SchemaNode ElementSchema = new(parent, "[]");
|
||||
|
||||
/// <summary>
|
||||
/// Проверка, что значение совместимо с текущим типом.
|
||||
@@ -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;
|
||||
|
||||
@@ -11,12 +11,12 @@ internal class DictionarySchemaType(SchemaNode parent) : AbstractSchemaType(pare
|
||||
/// <summary>
|
||||
/// Схема ключей словаря.
|
||||
/// </summary>
|
||||
public SchemaNode KeyNode = new(parent, "[key]");
|
||||
public readonly SchemaNode KeyNode = new(parent, "[key]");
|
||||
|
||||
/// <summary>
|
||||
/// Схема значений словаря.
|
||||
/// </summary>
|
||||
public SchemaNode ItemNode = new(parent, "[value]");
|
||||
public readonly SchemaNode ItemNode = new(parent, "[value]");
|
||||
|
||||
/// <summary>
|
||||
/// Проверка, что значение совместимо с текущим типом.
|
||||
|
||||
@@ -11,7 +11,7 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
||||
/// <summary>
|
||||
/// Элемнты полей объекта.
|
||||
/// </summary>
|
||||
public List<SchemaNode> Fields = [];
|
||||
public readonly List<SchemaNode> Fields = [];
|
||||
|
||||
/// <summary>
|
||||
/// Проверка, что значение совместимо с текущим типом.
|
||||
@@ -31,13 +31,10 @@ internal class ObjectSchemaType(SchemaNode parent) : AbstractSchemaType(parent)
|
||||
{
|
||||
JObject obj = (JObject)value;
|
||||
|
||||
foreach (SchemaNode field in Fields)
|
||||
{
|
||||
if (!obj.ContainsKey(field.Name))
|
||||
foreach (SchemaNode field in Fields.Where(field => !obj.ContainsKey(field.Name)))
|
||||
{
|
||||
field.IsNullable = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (KeyValuePair<string, JToken?> 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)
|
||||
|
||||
@@ -12,7 +12,7 @@ internal class StaticSchemaType(SchemaNode parent, JTokenType type) : AbstractSc
|
||||
/// <summary>
|
||||
/// Тип значения.
|
||||
/// </summary>
|
||||
protected JTokenType Type = type;
|
||||
protected readonly JTokenType Type = type;
|
||||
|
||||
/// <summary>
|
||||
/// Набор возможных значений и их количества.
|
||||
|
||||
Reference in New Issue
Block a user