75 lines
2.2 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|