89 lines
3.3 KiB
C#
89 lines
3.3 KiB
C#
using System.Collections;
|
|
using static LinqToDB.Reflection.Methods.LinqToDB.Insert;
|
|
|
|
namespace Pf2e.Web.Helpers.Format;
|
|
|
|
/// <summary>
|
|
/// Абстрактный класс форматтера значений.
|
|
/// </summary>
|
|
public abstract class ValueFormatter
|
|
{
|
|
/// <summary>
|
|
/// Проверяет, может ли форматтер обработать указанный тип.
|
|
/// </summary>
|
|
/// <param name="type">Тип значения.</param>
|
|
/// <returns><c>true</c>, если форматтер может обработать тип, иначе <c>false</c>.</returns>
|
|
public abstract bool CanFormat(Type type);
|
|
|
|
/// <summary>
|
|
/// Форматирует значение для отображения.
|
|
/// </summary>
|
|
/// <param name="value">Значение для форматирования.</param>
|
|
/// <returns>Строковое представление отформатированного значения.</returns>
|
|
public abstract string Format(object value);
|
|
|
|
/// <summary>
|
|
/// Форматирует имя типа для отображения.
|
|
/// </summary>
|
|
/// <param name="type">Тип значения.</param>
|
|
/// <returns>Строковое представление имени типа.</returns>
|
|
public virtual string TypeName(Type type) => type.Name;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Форматтер для конкретного типа.
|
|
/// </summary>
|
|
/// <typeparam name="T">Тип значения.</typeparam>
|
|
/// <param name="formatter">Функция форматирования значения.</param>
|
|
public class TypeValueFormatter<T>(Func<object, string> formatter) : ValueFormatter
|
|
{
|
|
public override bool CanFormat(Type type) => type == typeof(T);
|
|
|
|
public override string Format(object value) => formatter(value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Форматтер с пользовательскими функциями проверки и форматирования.
|
|
/// </summary>
|
|
/// <param name="checker">Функция проверки типа.</param>
|
|
/// <param name="formatter">Функция форматирования значения.</param>
|
|
public class CustomValueFormatter(
|
|
Func<Type, bool> checker,
|
|
Func<object, string> formatter,
|
|
Func<Type, string>? typeName = null
|
|
) : ValueFormatter
|
|
{
|
|
public override bool CanFormat(Type type) => checker(type);
|
|
|
|
public override string Format(object value) => formatter(value);
|
|
|
|
public override string TypeName(Type type) => typeName?.Invoke(type) ?? base.TypeName(type);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Форматтер для коллекций.
|
|
/// </summary>
|
|
public class CollectionFormatter() : ValueFormatter
|
|
{
|
|
public override bool CanFormat(Type type) =>
|
|
typeof(IEnumerable).IsAssignableFrom(type) && type != typeof(string);
|
|
|
|
public override string Format(object value)
|
|
{
|
|
IEnumerable collection = (IEnumerable)value;
|
|
List<string> items = [];
|
|
|
|
foreach (object? item in collection)
|
|
{
|
|
items.Add(Formatters.Format(item));
|
|
}
|
|
|
|
return items.Count == 0 ? "(empty)" : string.Join("<br/>", items);
|
|
}
|
|
|
|
public override string TypeName(Type type)
|
|
{
|
|
return $"{type.Name[..^2]}<{string.Join(", ", type.GetGenericArguments().Select(t => t.Name))}>";
|
|
}
|
|
}
|