Fixed mixed dictionary

This commit is contained in:
2025-04-08 17:55:43 +04:00
parent 6367ced32e
commit 0558643183
5 changed files with 63 additions and 10 deletions
@@ -39,10 +39,17 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium
"Item.spell.system.heightening.levels.[value].damage",
"Item.spell.system.overlays",
"Item.spell.system.overlays.[value].system.damage",
"Item.spell.system.overlays.[value].system.heightening"
"Item.spell.system.overlays.[value].system.heightening",
"Item.spell.system.overlays.[value].system.heightening.[value]"
];
public override AbstractSchemaType Resolve(SchemaNode node, JToken? value)
/// <summary>
/// Частное определение типа поля.
/// </summary>
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
/// <param name="value">Добавляемое значение.</param>
/// <returns>Новый тип для схемы данных. `null`, что бы использовать значение по умолчанию</returns>
protected override AbstractSchemaType? CustomResolve(SchemaNode node, JToken? value)
{
if (CheckPath(node, DictionaryPaths))
{
@@ -54,7 +61,7 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium
return new FoundryRulesSchemaType(node);
}
return base.Resolve(node, value);
return null;
}
}
}
+12 -2
View File
@@ -103,8 +103,18 @@ namespace Pf2eDataScrapper.SchemaBuilder
}
var newType = Resolver.Resolve(this, value);
newType.AddValue(value);
Types.Add(newType);
if (newType.IsCompatibleValue(value))
{
Types.Add(newType);
newType.AddValue(value);
}
else
{
var fallbackType = Resolver.Resolve(this, value, true);
Types.Add(fallbackType);
fallbackType.AddValue(value);
}
}
/// <summary>
+38 -2
View File
@@ -58,23 +58,45 @@ namespace Pf2eDataScrapper.SchemaBuilder
return value.Type;
}
/// <summary>
/// Частное определение типа поля.
/// </summary>
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
/// <param name="value">Добавляемое значение.</param>
/// <returns>Новый тип для схемы данных. `null`, что бы использовать значение по умолчанию</returns>
protected virtual AbstractSchemaType? CustomResolve(SchemaNode node, JToken? value)
{
return null;
}
/// <summary>
/// Определение типа поля.
/// </summary>
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
/// <param name="value">Добавляемое значение.</param>
/// <param name="disableResolve">Добавляемое значение.</param>
/// <returns>Новый тип для схемы данных</returns>
/// <exception cref="ArgumentNullException">
/// Возникает, если у `value` значение идентично `null`
/// (такие значения должны обрабаотываться в `SchemaNode`).
/// </exception>
public virtual AbstractSchemaType Resolve(SchemaNode node, JToken? value)
public AbstractSchemaType Resolve(SchemaNode node, JToken? value, bool disableResolve)
{
if (!disableResolve)
{
var customType = this.CustomResolve(node, value);
if (customType is not null)
{
return customType;
}
}
var type = TokenType(value);
if (type == JTokenType.Null)
{
throw new ArgumentNullException();
throw new ArgumentNullException(nameof(value));
}
return type switch
@@ -85,5 +107,19 @@ namespace Pf2eDataScrapper.SchemaBuilder
};
}
/// <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);
}
}
}
@@ -69,8 +69,8 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types
{
return string.Join("\n" + Tab, [
base.ToString(),
"Key:" + Indent(KeyNode.ToString()),
"Value:" + Indent(ItemNode.ToString())
"#key : " + Indent(KeyNode.ToString()),
"#value : " + Indent(ItemNode.ToString())
]);
}
}
@@ -94,7 +94,7 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types
result += $" ({count} different values)";
if (count is > ElementLimit or <= 0)
if (count is > ElementLimit or <= 0 || (Type == JTokenType.String && Values.Any(s => s.ToString().Contains('\n'))))
{
return result.Trim();
}