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.heightening.levels.[value].damage",
"Item.spell.system.overlays", "Item.spell.system.overlays",
"Item.spell.system.overlays.[value].system.damage", "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)) if (CheckPath(node, DictionaryPaths))
{ {
@@ -54,7 +61,7 @@ namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.Compendium
return new FoundryRulesSchemaType(node); 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); 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> /// <summary>
+38 -2
View File
@@ -58,23 +58,45 @@ namespace Pf2eDataScrapper.SchemaBuilder
return value.Type; 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>
/// Определение типа поля. /// Определение типа поля.
/// </summary> /// </summary>
/// <param name="node">Поле схемы данных, для которого создаётся тип.</param> /// <param name="node">Поле схемы данных, для которого создаётся тип.</param>
/// <param name="value">Добавляемое значение.</param> /// <param name="value">Добавляемое значение.</param>
/// <param name="disableResolve">Добавляемое значение.</param>
/// <returns>Новый тип для схемы данных</returns> /// <returns>Новый тип для схемы данных</returns>
/// <exception cref="ArgumentNullException"> /// <exception cref="ArgumentNullException">
/// Возникает, если у `value` значение идентично `null` /// Возникает, если у `value` значение идентично `null`
/// (такие значения должны обрабаотываться в `SchemaNode`). /// (такие значения должны обрабаотываться в `SchemaNode`).
/// </exception> /// </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); var type = TokenType(value);
if (type == JTokenType.Null) if (type == JTokenType.Null)
{ {
throw new ArgumentNullException(); throw new ArgumentNullException(nameof(value));
} }
return type switch 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, [ return string.Join("\n" + Tab, [
base.ToString(), base.ToString(),
"Key:" + Indent(KeyNode.ToString()), "#key : " + Indent(KeyNode.ToString()),
"Value:" + Indent(ItemNode.ToString()) "#value : " + Indent(ItemNode.ToString())
]); ]);
} }
} }
@@ -94,7 +94,7 @@ namespace Pf2eDataScrapper.SchemaBuilder.Types
result += $" ({count} different values)"; 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(); return result.Trim();
} }