using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TinaX.Systems.Configuration
{
///
/// Base helper class for implementing an
///
public abstract class ConfigurationProvider : IConfigurationProvider
{
protected ConfigurationProvider()
{
Data = new Dictionary(StringComparer.OrdinalIgnoreCase);
}
protected IDictionary Data { get; set; }
///
/// Attempts to find a value with the given key, returns true if one is found, false otherwise.
///
///
///
///
public virtual bool TryGet(string key, out string value)
=> this.Data.TryGetValue(key, out value);
public virtual void Set(string key, string value)
=> this.Data[key] = value;
public virtual void Load() { }
public IEnumerable GetChildKeys(IEnumerable earlierKeys, string parentPath)
{
var prefix = parentPath == null ? string.Empty : parentPath + ConfigurationPath.KeyDelimiter;
return Data
.Where(kv => kv.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
.Select(kv => Segment(kv.Key, prefix.Length))
.Concat(earlierKeys)
.OrderBy(k => k, ConfigurationKeyComparer.Instance);
}
private static string Segment(string key, int prefixLength)
{
var indexOf = key.IndexOf(ConfigurationPath.KeyDelimiter, prefixLength, StringComparison.OrdinalIgnoreCase);
return indexOf < 0 ? key.Substring(prefixLength) : key.Substring(prefixLength, indexOf - prefixLength);
}
///
/// Triggers the reload change token and creates a new one.
///
protected void OnReload() { }
///
/// Generates a string representing this provider name and relevant details.
///
/// The configuration name.
public override string ToString() => $"{GetType().Name}";
}
}