diff options
Diffstat (limited to 'lib/VNLib.Plugins.Extensions.Loading/src/Configuration')
3 files changed, 133 insertions, 13 deletions
diff --git a/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/ConfigScope.cs b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/ConfigScope.cs index 7f5c09c..d8f4347 100644 --- a/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/ConfigScope.cs +++ b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/ConfigScope.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Plugins.Extensions.Loading @@ -29,13 +29,15 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; +using VNLib.Utils.Resources; + namespace VNLib.Plugins.Extensions.Loading { internal sealed class ConfigScope: IConfigScope { - private readonly Lazy<IReadOnlyDictionary<string, JsonElement>> _config; + private readonly LazyInitializer<IReadOnlyDictionary<string, JsonElement>> _config; private readonly JsonElement _element; @@ -48,36 +50,40 @@ namespace VNLib.Plugins.Extensions.Loading private IReadOnlyDictionary<string, JsonElement> LoadTable() { - return _element.EnumerateObject().ToDictionary(static k => k.Name, static k => k.Value); + return _element.EnumerateObject() + .ToDictionary( + static k => k.Name, + static k => k.Value + ); } ///<inheritdoc/> - public JsonElement this[string key] => _config.Value[key]; + public JsonElement this[string key] => _config.Instance[key]; ///<inheritdoc/> - public IEnumerable<string> Keys => _config.Value.Keys; + public IEnumerable<string> Keys => _config.Instance.Keys; ///<inheritdoc/> - public IEnumerable<JsonElement> Values => _config.Value.Values; + public IEnumerable<JsonElement> Values => _config.Instance.Values; ///<inheritdoc/> - public int Count => _config.Value.Count; + public int Count => _config.Instance.Count; ///<inheritdoc/> public string ScopeName { get; } ///<inheritdoc/> - public bool ContainsKey(string key) => _config.Value.ContainsKey(key); + public bool ContainsKey(string key) => _config.Instance.ContainsKey(key); ///<inheritdoc/> public T Deserialze<T>() => _element.Deserialize<T>()!; ///<inheritdoc/> - public IEnumerator<KeyValuePair<string, JsonElement>> GetEnumerator() => _config.Value.GetEnumerator(); + public IEnumerator<KeyValuePair<string, JsonElement>> GetEnumerator() => _config.Instance.GetEnumerator(); ///<inheritdoc/> - public bool TryGetValue(string key, [MaybeNullWhen(false)] out JsonElement value) => _config.Value.TryGetValue(key, out value); + public bool TryGetValue(string key, [MaybeNullWhen(false)] out JsonElement value) => _config.Instance.TryGetValue(key, out value); - IEnumerator IEnumerable.GetEnumerator() => _config.Value.GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => _config.Instance.GetEnumerator(); } } diff --git a/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/IOnConfigValidation.cs b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/IOnConfigValidation.cs index 6d4641b..6eeba78 100644 --- a/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/IOnConfigValidation.cs +++ b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/IOnConfigValidation.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2023 Vaughn Nugent +* Copyright (c) 2024 Vaughn Nugent * * Library: VNLib * Package: VNLib.Plugins.Extensions.Loading @@ -33,6 +33,6 @@ namespace VNLib.Plugins.Extensions.Loading /// <summary> /// Validates a json configuration during deserialzation /// </summary> - void Validate(); + void OnValidate(); } } diff --git a/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/Validate.cs b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/Validate.cs new file mode 100644 index 0000000..1bb6787 --- /dev/null +++ b/lib/VNLib.Plugins.Extensions.Loading/src/Configuration/Validate.cs @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2024 Vaughn Nugent +* +* Library: VNLib +* Package: VNLib.Plugins.Extensions.Loading +* File: Validate.cs +* +* Validate.cs is part of VNLib.Plugins.Extensions.Loading which is part of the larger +* VNLib collection of libraries and utilities. +* +* VNLib.Plugins.Extensions.Loading is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* VNLib.Plugins.Extensions.Loading is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +using VNLib.Utils.IO; + +namespace VNLib.Plugins.Extensions.Loading.Configuration +{ + /// <summary> + /// A class that allows for easy configuration validation + /// </summary> + public sealed class Validate + { + /// <summary> + /// Ensures the object is not null and not an empty string, + /// otherwise a <see cref="ConfigurationValidationException"/> is raised + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="obj">The object to test</param> + /// <param name="message">The message to display to the user on loading</param> + /// <exception cref="ConfigurationValidationException"></exception> + [DoesNotReturn] + public static void NotNull<T>(T? obj, string message) where T : class + { + if (obj is null) + { + throw new ConfigurationValidationException(message); + } + + if (obj is string s && string.IsNullOrWhiteSpace(s)) + { + throw new ConfigurationValidationException(message); + } + } + + /// <summary> + /// + /// </summary> + /// <param name="condition"></param> + /// <param name="message"></param> + /// <exception cref="ConfigurationValidationException"></exception> + public static void Assert([DoesNotReturnIf(false)] bool condition, string message) + { + if (!condition) + { + throw new ConfigurationValidationException(message); + } + } + + public static void NotEqual<T>(T a, T b, string message) + { + if (a is null || b is null) + { + throw new ConfigurationValidationException(message); + } + + if (a.Equals(b)) + { + throw new ConfigurationValidationException(message); + } + } + + public static void Range2<T>(T value, T min, T max, string message) + where T : IComparable<T> + { + //Compare the value against min/max calues and raise exception if it is + if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) + { + throw new ConfigurationValidationException(message); + } + } + + + public static void Range<T>(T value, T min, T max, [CallerArgumentExpression(nameof(value))] string? paramName = null) + where T : IComparable<T> + { + + Range2(value, min, max, $"Value for {paramName} must be between {min} and {max}. Value: {value}"); + } + + + public static void FileExists(string path) + { + if (!FileOperations.FileExists(path)) + { + throw new ConfigurationValidationException($"Required file: {path} not found"); + } + } + } +} |