1 files changed, 47 insertions, 0 deletions
diff --git a/MatrixUtils.Desktop/RMUDesktopConfiguration.cs b/MatrixUtils.Desktop/RMUDesktopConfiguration.cs
new file mode 100644
index 0000000..62646ca
--- /dev/null
+++ b/MatrixUtils.Desktop/RMUDesktopConfiguration.cs
@@ -0,0 +1,47 @@
+using System.Collections;
+using System.Diagnostics.CodeAnalysis;
+using ArcaneLibs.Extensions;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+
+namespace MatrixUtils.Desktop;
+
+public class RMUDesktopConfiguration {
+ private static ILogger<RMUDesktopConfiguration> _logger;
+
+ [RequiresUnreferencedCode("Uses reflection binding")]
+ public RMUDesktopConfiguration(ILogger<RMUDesktopConfiguration> logger, IConfiguration config, HostBuilderContext host) {
+ _logger = logger;
+ logger.LogInformation("Loading configuration for environment: {}...", host.HostingEnvironment.EnvironmentName);
+ config.GetSection("RMUDesktop").Bind(this);
+ DataStoragePath = ExpandPath(DataStoragePath);
+ CacheStoragePath = ExpandPath(CacheStoragePath);
+ }
+
+ public string DataStoragePath { get; set; } = "";
+ public string CacheStoragePath { get; set; } = "";
+ public string? SentryDsn { get; set; }
+
+ private static string ExpandPath(string path, bool retry = true) {
+ _logger.LogInformation("Expanding path `{}`", path);
+
+ if (path.StartsWith('~')) {
+ path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), path[1..]);
+ }
+
+ Environment.GetEnvironmentVariables().Cast<DictionaryEntry>().OrderByDescending(x => x.Key.ToString()!.Length).ToList().ForEach(x => {
+ path = path.Replace($"${x.Key}", x.Value.ToString());
+ });
+
+ _logger.LogInformation("Expanded path to `{}`", path);
+ var tries = 0;
+ while (retry && path.ContainsAnyOf("~$".Split())) {
+ if (tries++ > 100)
+ throw new Exception($"Path `{path}` contains unrecognised environment variables");
+ path = ExpandPath(path, false);
+ }
+
+ return path;
+ }
+}
|