using Newtonsoft.Json.Linq; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Primitives; namespace Core.Configurations.SmartConfiguration { public class JsonConfigurationSection : IConfigurationSection { private readonly JObject _data; private readonly string _path; private readonly string _normalizedPath; public JsonConfigurationSection(JObject data, string path) { _data = data ?? throw new ArgumentNullException(nameof(data)); _path = path ?? throw new ArgumentNullException(nameof(path)); _normalizedPath = NormalizePath(_path); } public string this[string key] { get { if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); var token = _data.SelectToken($"{_normalizedPath}.{NormalizePath(key)}"); return token?.ToString(); } set => throw new NotImplementedException("Setting values is not supported."); } public string Key => _path.Split(':').Last(); public string Path => _path; public string Value { get { var token = _data.SelectToken(_normalizedPath); return token?.ToString(); } set => throw new NotImplementedException("Setting values is not supported."); } public Microsoft.Extensions.Configuration.IConfigurationSection GetSection(string key) { if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key)); return null;// new JsonConfigurationSection(_data, string.IsNullOrEmpty(_path) ? key : $"{_path}:{key}"); } public JToken GetToken() => _data.SelectToken(_normalizedPath); public IEnumerable GetChildren() { var token = _data.SelectToken(_normalizedPath); if (token is JObject obj) { return obj.Properties() .Select(p => new JsonConfigurationSection(_data, string.IsNullOrEmpty(_path) ? p.Name : $"{_path}:{p.Name}")); } return Enumerable.Empty(); } public T Get() where T : class { var token = _data.SelectToken(_normalizedPath); return token?.ToObject(); } public IChangeToken GetReloadToken() => new ConfigurationReloadToken(); private static string NormalizePath(string path) { return path?.Replace(":", ".", StringComparison.Ordinal) ?? string.Empty; } } }