aboutsummaryrefslogtreecommitdiff
path: root/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2023-01-09 15:09:13 -0500
committerLibravatar vnugent <public@vaughnnugent.com>2023-01-09 15:09:13 -0500
commita46c3bf452d287b50b2e7dd5a24f5995c9fd26f6 (patch)
tree3a978b2dd2887b5c0e25f595516594a647d8e880 /VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs
parent189c6714057bf45553847eaeb9ce97eb7272eb8c (diff)
Restructure
Diffstat (limited to 'VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs')
-rw-r--r--VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs200
1 files changed, 0 insertions, 200 deletions
diff --git a/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs b/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs
deleted file mode 100644
index 21f2fcb..0000000
--- a/VNLib.Plugins.Extensions.Loading/ConfigurationExtensions.cs
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
-* Copyright (c) 2022 Vaughn Nugent
-*
-* Library: VNLib
-* Package: VNLib.Plugins.Extensions.Loading
-* File: ConfigurationExtensions.cs
-*
-* ConfigurationExtensions.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 General Public License as published
-* by the Free Software Foundation, either version 2 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
-* General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with VNLib.Plugins.Extensions.Loading. If not, see http://www.gnu.org/licenses/.
-*/
-
-using System;
-using System.Linq;
-using System.Text.Json;
-using System.Reflection;
-using System.Collections.Generic;
-
-using VNLib.Utils.Extensions;
-
-namespace VNLib.Plugins.Extensions.Loading
-{
- /// <summary>
- /// Specifies a configuration variable name in the plugin's configuration
- /// containing data specific to the type
- /// </summary>
- [AttributeUsage(AttributeTargets.Class)]
- public sealed class ConfigurationNameAttribute : Attribute
- {
- /// <summary>
- ///
- /// </summary>
- public string ConfigVarName { get; }
-
- /// <summary>
- /// Initializes a new <see cref="ConfigurationNameAttribute"/>
- /// </summary>
- /// <param name="configVarName">The name of the configuration variable for the class</param>
- public ConfigurationNameAttribute(string configVarName)
- {
- ConfigVarName = configVarName;
- }
- }
-
- /// <summary>
- /// Contains extensions for plugin configuration specifc extensions
- /// </summary>
- public static class ConfigurationExtensions
- {
- public const string S3_CONFIG = "s3_config";
- public const string S3_SECRET_KEY = "s3_secret";
-
- /// <summary>
- /// Retrieves a top level configuration dictionary of elements for the specified type.
- /// The type must contain a <see cref="ConfigurationNameAttribute"/>
- /// </summary>
- /// <typeparam name="T">The type to get the configuration of</typeparam>
- /// <param name="plugin"></param>
- /// <returns>A <see cref="Dictionary{TKey, TValue}"/> of top level configuration elements for the type</returns>
- /// <exception cref="ObjectDisposedException"></exception>
- public static IReadOnlyDictionary<string, JsonElement> GetConfigForType<T>(this PluginBase plugin)
- {
- Type t = typeof(T);
- return plugin.GetConfigForType(t);
- }
- /// <summary>
- /// Retrieves a top level configuration dictionary of elements with the specified property name,
- /// from the plugin config first, or falls back to the host config file
- /// </summary>
- /// <param name="plugin"></param>
- /// <param name="propName">The config property name to retrieve</param>
- /// <returns>A <see cref="Dictionary{TKey, TValue}"/> of top level configuration elements for the type</returns>
- /// <exception cref="KeyNotFoundException"></exception>
- /// <exception cref="ObjectDisposedException"></exception>
- public static IReadOnlyDictionary<string, JsonElement> GetConfig(this PluginBase plugin, string propName)
- {
- plugin.ThrowIfUnloaded();
- try
- {
- //Try to get the element from the plugin config first
- if (!plugin.PluginConfig.TryGetProperty(propName, out JsonElement el))
- {
- //Fallback to the host config
- el = plugin.HostConfig.GetProperty(propName);
- }
- //Get the top level config as a dictionary
- return el.EnumerateObject().ToDictionary(static k => k.Name, static k => k.Value);
- }
- catch(KeyNotFoundException)
- {
- throw new KeyNotFoundException($"Missing required top level configuration object '{propName}', in host/plugin configuration files");
- }
- }
- /// <summary>
- /// Retrieves a top level configuration dictionary of elements with the specified property name,
- /// from the plugin config first, or falls back to the host config file
- /// </summary>
- /// <param name="plugin"></param>
- /// <param name="propName">The config property name to retrieve</param>
- /// <returns>A <see cref="Dictionary{TKey, TValue}"/> of top level configuration elements for the type</returns>
- /// <exception cref="ObjectDisposedException"></exception>
- public static IReadOnlyDictionary<string, JsonElement>? TryGetConfig(this PluginBase plugin, string propName)
- {
- plugin.ThrowIfUnloaded();
- //Try to get the element from the plugin config first, or fallback to host
- if (plugin.PluginConfig.TryGetProperty(propName, out JsonElement el) || plugin.HostConfig.TryGetProperty(propName, out el))
- {
- //Get the top level config as a dictionary
- return el.EnumerateObject().ToDictionary(static k => k.Name, static k => k.Value);
- }
- //No config found
- return null;
- }
-
- /// <summary>
- /// Retrieves a top level configuration dictionary of elements for the specified type.
- /// The type must contain a <see cref="ConfigurationNameAttribute"/>
- /// </summary>
- /// <param name="plugin"></param>
- /// <param name="type">The type to get configuration data for</param>
- /// <returns>A <see cref="Dictionary{TKey, TValue}"/> of top level configuration elements for the type</returns>
- /// <exception cref="ObjectDisposedException"></exception>
- public static IReadOnlyDictionary<string, JsonElement> GetConfigForType(this PluginBase plugin, Type type)
- {
- //Get config name attribute from plugin type
- ConfigurationNameAttribute? configName = type.GetCustomAttribute<ConfigurationNameAttribute>();
- return configName?.ConfigVarName == null
- ? throw new KeyNotFoundException("No configuration attribute set")
- : plugin.GetConfig(configName.ConfigVarName);
- }
-
- /// <summary>
- /// Shortcut extension for <see cref="GetConfigForType{T}(PluginBase)"/> to get
- /// config of current class
- /// </summary>
- /// <param name="obj">The object that a configuration can be retrieved for</param>
- /// <param name="plugin">The plugin containing configuration variables</param>
- /// <returns>A <see cref="Dictionary{TKey, TValue}"/> of top level configuration elements for the type</returns>
- /// <exception cref="ObjectDisposedException"></exception>
- public static IReadOnlyDictionary<string, JsonElement> GetConfig(this PluginBase plugin, object obj)
- {
- Type t = obj.GetType();
- return plugin.GetConfigForType(t);
- }
-
- /// <summary>
- /// Determines if the current plugin configuration contains the require properties to initialize
- /// the type
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="plugin"></param>
- /// <returns>True if the plugin config contains the require configuration property</returns>
- public static bool HasConfigForType<T>(this PluginBase plugin)
- {
- Type type = typeof(T);
- ConfigurationNameAttribute? configName = type.GetCustomAttribute<ConfigurationNameAttribute>();
- //See if the plugin contains a configuration varables
- return configName != null && plugin.PluginConfig.TryGetProperty(configName.ConfigVarName, out _);
- }
-
- /// <summary>
- /// Attempts to load the basic S3 configuration variables required
- /// for S3 client access
- /// </summary>
- /// <param name="plugin"></param>
- /// <returns>The S3 configuration object found in the plugin/host configuration</returns>
- public static S3Config? TryGetS3Config(this PluginBase plugin)
- {
- //Try get the config
- IReadOnlyDictionary<string, JsonElement>? s3conf = plugin.TryGetConfig(S3_CONFIG);
- if(s3conf == null)
- {
- return null;
- }
-
- //Try get the elements
- return new()
- {
- BaseBucket = s3conf.GetPropString("bucket"),
- ClientId = s3conf.GetPropString("access_key"),
- ServerAddress = s3conf.GetPropString("server_address"),
- UseSsl = s3conf.TryGetValue("use_ssl", out JsonElement el) && el.GetBoolean(),
- ClientSecret = plugin.TryGetSecretAsync(S3_SECRET_KEY),
- Region = s3conf.GetPropString("region"),
- };
- }
- }
-}