mirror of
https://github.com/claunia/plist-cil.git
synced 2025-12-16 19:14:26 +00:00
Basic value preprocessor implementation
This commit is contained in:
56
plist-cil/ValuePreprocessor.cs
Normal file
56
plist-cil/ValuePreprocessor.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Claunia.PropertyList
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Allows you to override the default value class initialization for the values found
|
||||||
|
/// in the parsed plists by registering your own preprocessing implementations.
|
||||||
|
/// </summary>
|
||||||
|
public static class ValuePreprocessor
|
||||||
|
{
|
||||||
|
public enum Types
|
||||||
|
{
|
||||||
|
BOOL, INTEGER, FLOATING_POINT, UNDEFINED_NUMBER,
|
||||||
|
STRING, DATA, DATE
|
||||||
|
};
|
||||||
|
|
||||||
|
private record struct TypeIdentifier(Types ValueType, Type ProcessingType);
|
||||||
|
private static T NullPreprocessor<T>(T value) => value;
|
||||||
|
|
||||||
|
private static readonly Dictionary<TypeIdentifier, Delegate> _preprocessors = new()
|
||||||
|
{
|
||||||
|
{ new(Types.BOOL, typeof(bool)), NullPreprocessor<bool> },
|
||||||
|
{ new(Types.BOOL, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.INTEGER, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.FLOATING_POINT, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.UNDEFINED_NUMBER, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.STRING, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.DATA, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.DATA, typeof(byte[])), NullPreprocessor<byte[]> },
|
||||||
|
{ new(Types.DATE, typeof(string)), NullPreprocessor<string> },
|
||||||
|
{ new(Types.DATE, typeof(double)), NullPreprocessor<double> },
|
||||||
|
};
|
||||||
|
|
||||||
|
public static void Register<T>(Func<T, T> preprocessor, Types type) =>
|
||||||
|
_preprocessors[new(type, typeof(T))] = preprocessor;
|
||||||
|
|
||||||
|
public static T Preprocess<T>(T value, Types type) =>
|
||||||
|
TryGetPreprocessor(type, out Func<T, T> preprocess)
|
||||||
|
? preprocess(value)
|
||||||
|
: throw new ArgumentException($"Failed to find a preprocessor for value '{value}'.");
|
||||||
|
|
||||||
|
private static bool TryGetPreprocessor<T>(Types type, out Func<T, T> preprocess)
|
||||||
|
{
|
||||||
|
if(_preprocessors.TryGetValue(new TypeIdentifier(type, typeof(T)), out Delegate preprocessor))
|
||||||
|
{
|
||||||
|
preprocess = (Func<T, T>) preprocessor;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
preprocess = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user