Files
FSI.BT.IR.Tools/Config.Net/Core/DynamicReader.cs
Stephan Maier 647f938eee v1.2
2024-08-27 08:10:27 +02:00

75 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using Config.Net.Core.Box;
namespace Config.Net.Core
{
class DynamicReader
{
private readonly string? _basePath;
private readonly IoHandler _ioHandler;
public DynamicReader(string? basePath, IoHandler ioHandler)
{
_basePath = basePath;
_ioHandler = ioHandler;
}
public object? Read(ResultBox rbox, int index = -1, params object[] arguments)
{
if (rbox is PropertyResultBox pbox) return ReadProperty(pbox, index);
if (rbox is ProxyResultBox xbox) return ReadProxy(xbox, index);
if (rbox is CollectionResultBox cbox) return ReadCollection(cbox, index);
if (rbox is MethodResultBox mbox) return ReadMethod(mbox, arguments);
throw new NotImplementedException($"don't know how to read {rbox.GetType()}");
}
private object? ReadProperty(PropertyResultBox pbox, int index)
{
string path = OptionPath.Combine(index, _basePath, pbox.StoreByName);
return _ioHandler.Read(pbox.ResultBaseType, path, pbox.DefaultResult);
}
private object ReadProxy(ProxyResultBox xbox, int index)
{
if (!xbox.IsInitialisedAt(index))
{
string prefix = OptionPath.Combine(index, _basePath, xbox.StoreByName);
xbox.InitialiseAt(index, _ioHandler, prefix);
}
return xbox.GetInstanceAt(index);
}
private object? ReadCollection(CollectionResultBox cbox, int index)
{
string lengthPath = OptionPath.Combine(index, _basePath, cbox.StoreByName);
lengthPath = OptionPath.AddLength(lengthPath);
if (!cbox.IsInitialised)
{
int length = (int?)_ioHandler.Read(typeof(int), lengthPath, 0) ?? 0;
cbox.Initialise(_basePath, length, this);
}
return cbox.CollectionInstance;
}
private object? ReadMethod(MethodResultBox mbox, object[] arguments)
{
string path = mbox.GetValuePath(arguments);
path = OptionPath.Combine(_basePath, path);
return _ioHandler.Read(mbox.ResultBaseType, path, mbox.DefaultResult);
}
}
}