#nullable enable
using IPA.Config.Data;
using System;
namespace IPA.Config.Stores
{
///
/// The base interface for a value converter for use by objects generated by
/// .
///
///
///
/// The object returned from , if fed into ,
/// should return equivalent structures. Similarly, if the result of
/// is fed into , the resulting object should be equivalent to the one passed to
/// .
///
///
/// The parent parameter to and should
/// be (ideally) the the top of the serialization tree, or some other generated object in that tree, rather than some arbitrary
/// object in the middle that is not managed by the generatd config system.
///
///
/// Converters do not need to perform null checks, as the serializer and deserializer will do that automatically.
///
///
public interface IValueConverter
{
///
/// Converts the given object to a .
///
/// the object to convert
/// the owning object of
/// a representation of as a structure
Value? ToValue(object? obj, object parent);
///
/// Converts the given to the object type handled by this converter.
///
/// the to deserialize
/// the object that will own the result
/// the deserialized object
object? FromValue(Value? value, object parent);
///
/// Gets the type that this handles.
///
Type Type { get; }
}
///
/// A strongly-typed .
///
/// the type of object to handle
///
public abstract class ValueConverter : IValueConverter
{
///
/// Converts the given object to a .
///
/// the object to convert
/// the owning object of
/// a representation of as a structure
///
public abstract Value? ToValue(T? obj, object parent);
///
/// Converts the given to the object type handled by this converter.
///
/// the to deserialize
/// the object that will own the result
/// the deserialized object
///
public abstract T? FromValue(Value? value, object parent);
Value? IValueConverter.ToValue(object? obj, object parent) => ToValue((T?)obj, parent);
object? IValueConverter.FromValue(Value? value, object parent) => FromValue(value, parent);
Type IValueConverter.Type => typeof(T);
}
}