about summary refs log tree commit diff
path: root/MatrixUtils.Desktop/RMUDesktopConfiguration.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MatrixUtils.Desktop/RMUDesktopConfiguration.cs')
-rw-r--r--MatrixUtils.Desktop/RMUDesktopConfiguration.cs47
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;
+    }
+}