about summary refs log tree commit diff
path: root/ModerationClient/Services/CommandLineConfiguration.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ModerationClient/Services/CommandLineConfiguration.cs')
-rw-r--r--ModerationClient/Services/CommandLineConfiguration.cs83
1 files changed, 56 insertions, 27 deletions
diff --git a/ModerationClient/Services/CommandLineConfiguration.cs b/ModerationClient/Services/CommandLineConfiguration.cs
index 4debd5c..63c3691 100644
--- a/ModerationClient/Services/CommandLineConfiguration.cs
+++ b/ModerationClient/Services/CommandLineConfiguration.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using ArcaneLibs;
@@ -6,47 +7,75 @@ using Microsoft.Extensions.Logging;
 
 namespace ModerationClient.Services;
 
-public class CommandLineConfiguration {
-    public CommandLineConfiguration(ILogger<CommandLineConfiguration> logger) {
-        var args = Environment.GetCommandLineArgs();
-        logger.LogInformation("Command line arguments: " + string.Join(", ", args));
+[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
+public record CommandLineConfiguration {
+    private readonly string? _loginData;
+
+    public static CommandLineConfiguration FromProcessArgs() {
+        // logger.LogInformation("Command line arguments: " + string.Join(", ", Environment.GetCommandLineArgs()));
+        CommandLineConfiguration cfg = FromSerialised(Environment.GetCommandLineArgs());
+
+        if (string.IsNullOrWhiteSpace(cfg.ProfileDirectory))
+            cfg = cfg with {
+                ProfileDirectory = cfg.IsTemporary
+                    ? Directory.CreateTempSubdirectory("ModerationClient-tmp").FullName
+                    : Util.ExpandPath($"$HOME/.local/share/ModerationClient/{cfg.Profile}")
+            };
+
+        // logger.LogInformation("Profile directory: " + cfg.ProfileDirectory);
+        Directory.CreateDirectory(cfg.ProfileDirectory);
+        if (!string.IsNullOrWhiteSpace(cfg.LoginData)) {
+            File.WriteAllText(Path.Combine(cfg.ProfileDirectory, "login.json"), cfg.LoginData);
+        }
+        return cfg;
+    }
+
+    public string[] Serialise() {
+        List<string> args = new();
+        if (Profile != "default") args.AddRange(["--profile", Profile]);
+        if (IsTemporary) args.Add("--temporary");
+        if (Math.Abs(Scale - 1f) > float.Epsilon) args.AddRange(["--scale", Scale.ToString()]);
+        if (ProfileDirectory != Util.ExpandPath("$HOME/.local/share/ModerationClient/default")) args.AddRange(["--profile-dir", ProfileDirectory]);
+        if (!string.IsNullOrWhiteSpace(_loginData)) args.AddRange(["--login-data", _loginData!]);
+        return args.ToArray();
+    }
+
+    public static CommandLineConfiguration FromSerialised(string[] args) {
+        CommandLineConfiguration cfg = new();
         for (var i = 0; i < args.Length; i++) {
-            logger.LogInformation("Processing argument: " + args[i]);
             switch (args[i]) {
                 case "--profile":
-                case "-p":
-                    if (args.Length <= i + 1 || args[i + 1].StartsWith("-")) {
-                        throw new ArgumentException("No profile specified");
-                    }
-
-                    Profile = args[++i];
-                    logger.LogInformation("Set profile to: " + Profile);
+                    cfg = cfg with { Profile = args[++i] };
                     break;
                 case "--temporary":
-                    IsTemporary = true;
-                    logger.LogInformation("Using temporary profile");
+                    cfg = cfg with { IsTemporary = true };
                     break;
                 case "--profile-dir":
-                    ProfileDirectory = args[++i];
+                    cfg = cfg with { ProfileDirectory = args[++i] };
                     break;
                 case "--scale":
-                    Scale = float.Parse(args[++i]);
+                    cfg = cfg with { Scale = float.Parse(args[++i]) };
+                    break;
+                case "--login-data":
+                    cfg = cfg with { LoginData = args[++i] };
                     break;
             }
         }
 
-        if (string.IsNullOrWhiteSpace(ProfileDirectory))
-            ProfileDirectory = IsTemporary
-                ? Directory.CreateTempSubdirectory("ModerationClient-tmp").FullName
-                : Util.ExpandPath($"$HOME/.local/share/ModerationClient/{Profile}");
-
-        logger.LogInformation("Profile directory: " + ProfileDirectory);
-        Directory.CreateDirectory(ProfileDirectory);
+        return cfg;
     }
 
-    public string Profile { get; private set; } = "default";
-    public bool IsTemporary { get; private set; }
+    public string Profile { get; init; } = "default";
+    public bool IsTemporary { get; init; }
 
-    public string ProfileDirectory { get; private set; }
-    public float Scale { get; private set; } = 1f;
+    public string ProfileDirectory { get; init; }
+    public float Scale { get; init; } = 1f;
+
+    public string? LoginData {
+        get => _loginData;
+        init {
+            Console.WriteLine("Setting login data: " + value);
+            _loginData = value;
+        }
+    }
 }
\ No newline at end of file