using IPA.Config.Data;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace IPA.Config.Stores.Converters
|
|
{
|
|
/// <summary>
|
|
/// Provides utility functions for custom converters.
|
|
/// </summary>
|
|
public static class Converter
|
|
{
|
|
/// <summary>
|
|
/// Gets the integral value of a <see cref="Value"/>, coercing a <see cref="FloatingPoint"/> if necessary,
|
|
/// or <see langword="null"/> if <paramref name="val"/> is not an <see cref="Integer"/> or <see cref="FloatingPoint"/>.
|
|
/// </summary>
|
|
/// <param name="val">the <see cref="Value"/> to get the integral value of</param>
|
|
/// <returns>the integral value of <paramref name="val"/>, or <see langword="null"/></returns>
|
|
public static long? IntValue(Value val)
|
|
=> val is Integer inte ? inte.Value :
|
|
val is FloatingPoint fp ? fp.AsInteger()?.Value :
|
|
null;
|
|
/// <summary>
|
|
/// Gets the floaing point value of a <see cref="Value"/>, coercing an <see cref="Integer"/> if necessary,
|
|
/// or <see langword="null"/> if <paramref name="val"/> is not an <see cref="Integer"/> or <see cref="FloatingPoint"/>.
|
|
/// </summary>
|
|
/// <param name="val">the <see cref="Value"/> to get the floaing point value of</param>
|
|
/// <returns>the floaing point value of <paramref name="val"/>, or <see langword="null"/></returns>
|
|
public static decimal? FloatValue(Value val)
|
|
=> val is FloatingPoint fp ? fp.Value :
|
|
val is Integer inte ? inte.AsFloat()?.Value :
|
|
null;
|
|
}
|
|
|
|
public class CustomObjectConverter<T> : ValueConverter<T> where T : class
|
|
{
|
|
private interface IImpl
|
|
{
|
|
T FromValue(Value value, object parent);
|
|
Value ToValue(T obj, object parent);
|
|
}
|
|
private class Impl<U> : IImpl where U : class, GeneratedStore.IGeneratedStore, T
|
|
{
|
|
private static readonly GeneratedStore.GeneratedStoreCreator creator = GeneratedStore.GetCreator(typeof(T));
|
|
|
|
public T FromValue(Value value, object parent)
|
|
{ // lots of casting here, but it works i promise
|
|
var obj = creator(parent as GeneratedStore.IGeneratedStore) as U;
|
|
obj.Deserialize(value);
|
|
return obj;
|
|
}
|
|
|
|
public Value ToValue(T obj, object parent)
|
|
{
|
|
if (obj is GeneratedStore.IGeneratedStore store)
|
|
return store.Serialize();
|
|
else
|
|
return null; // TODO: make this behave sanely instead of just giving null
|
|
}
|
|
}
|
|
|
|
private static readonly IImpl impl = (IImpl)Activator.CreateInstance(
|
|
typeof(Impl<>).MakeGenericType(GeneratedStore.GetGeneratedType(typeof(T))));
|
|
|
|
public static T Deserialize(Value value, object parent)
|
|
=> impl.FromValue(value, parent);
|
|
|
|
public static Value Serialize(T obj, object parent)
|
|
=> impl.ToValue(obj, parent);
|
|
|
|
public override T FromValue(Value value, object parent)
|
|
=> impl.FromValue(value, parent);
|
|
|
|
public override Value ToValue(T obj, object parent)
|
|
=> impl.ToValue(obj, parent);
|
|
}
|
|
|
|
}
|