Files

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))}>";
}
}