New config system. Tracks changes instead of the whole thing.
This commit is contained in:
parent
68336df868
commit
b2bc9fa7ee
76
SrcMod/Shell/ObjectModels/Config.cs
Normal file
76
SrcMod/Shell/ObjectModels/Config.cs
Normal file
@ -0,0 +1,76 @@
|
||||
namespace SrcMod.Shell.ObjectModels;
|
||||
|
||||
public struct Config
|
||||
{
|
||||
public const string FilePath = "config.json";
|
||||
|
||||
public static readonly Config Defaults;
|
||||
|
||||
public static Config LoadedConfig
|
||||
{
|
||||
get => p_applied;
|
||||
set
|
||||
{
|
||||
p_applied = value;
|
||||
p_changes = p_applied.GetChanges(Defaults);
|
||||
}
|
||||
}
|
||||
|
||||
private static Config p_applied;
|
||||
private static ConfigChanges? p_changes;
|
||||
|
||||
static Config()
|
||||
{
|
||||
Defaults = new();
|
||||
}
|
||||
|
||||
public string[] SteamDirectories;
|
||||
|
||||
public Config ApplyChanges(ConfigChanges changes) => this with
|
||||
{
|
||||
SteamDirectories = changes.SteamDirectories ?? SteamDirectories
|
||||
};
|
||||
public ConfigChanges GetChanges(Config? baseConfig = null)
|
||||
{
|
||||
Config reference = baseConfig ?? Defaults;
|
||||
return new()
|
||||
{
|
||||
SteamDirectories = reference.SteamDirectories == SteamDirectories ? null : SteamDirectories
|
||||
};
|
||||
}
|
||||
|
||||
public static void LoadConfig(string basePath)
|
||||
{
|
||||
string fullPath = Path.Combine(basePath, FilePath);
|
||||
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
p_applied = Defaults;
|
||||
p_changes = null;
|
||||
return;
|
||||
}
|
||||
StreamReader reader = new(fullPath);
|
||||
JsonTextReader jsonReader = new(reader);
|
||||
p_changes = Serializer.Deserialize<ConfigChanges?>(jsonReader);
|
||||
jsonReader.Close();
|
||||
reader.Close();
|
||||
|
||||
p_applied = p_changes is null ? Defaults : Defaults.ApplyChanges(p_changes.Value);
|
||||
}
|
||||
public static void SaveConfig(string basePath)
|
||||
{
|
||||
string fullPath = Path.Combine(basePath, FilePath);
|
||||
|
||||
if (p_changes is null || !p_changes.Value.HasChange)
|
||||
{
|
||||
if (File.Exists(fullPath)) File.Delete(fullPath);
|
||||
return;
|
||||
}
|
||||
|
||||
StreamWriter writer = new(fullPath);
|
||||
JsonTextWriter jsonWriter = new(writer);
|
||||
Serializer.Serialize(jsonWriter, p_changes);
|
||||
jsonWriter.Close();
|
||||
writer.Close();
|
||||
}
|
||||
}
|
||||
8
SrcMod/Shell/ObjectModels/ConfigChanges.cs
Normal file
8
SrcMod/Shell/ObjectModels/ConfigChanges.cs
Normal file
@ -0,0 +1,8 @@
|
||||
namespace SrcMod.Shell.ObjectModels;
|
||||
|
||||
public record struct ConfigChanges
|
||||
{
|
||||
public bool HasChange => SteamDirectories is not null;
|
||||
|
||||
public string[]? SteamDirectories;
|
||||
}
|
||||
@ -1,46 +0,0 @@
|
||||
namespace SrcMod.Shell.ObjectModels;
|
||||
|
||||
public class ShellConfig
|
||||
{
|
||||
public const string FilePath = "config.json";
|
||||
|
||||
public static ShellConfig Defaults => new()
|
||||
{
|
||||
SteamDirectories = new[]
|
||||
{
|
||||
"Temp"
|
||||
}
|
||||
};
|
||||
public static ShellConfig LoadedConfig => p_data ?? Defaults;
|
||||
|
||||
private static ShellConfig? p_data;
|
||||
|
||||
public string[] SteamDirectories;
|
||||
|
||||
public static void LoadConfig(string basePath)
|
||||
{
|
||||
string fullPath = Path.Combine(basePath, FilePath);
|
||||
|
||||
if (!File.Exists(fullPath))
|
||||
{
|
||||
p_data = null;
|
||||
return;
|
||||
}
|
||||
StreamReader reader = new(fullPath);
|
||||
JsonTextReader jsonReader = new(reader);
|
||||
p_data = Serializer.Deserialize<ShellConfig>(jsonReader);
|
||||
jsonReader.Close();
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
public static void SaveConfig(string basePath)
|
||||
{
|
||||
string fullPath = Path.Combine(basePath, FilePath);
|
||||
|
||||
StreamWriter writer = new(fullPath);
|
||||
JsonTextWriter jsonWriter = new(writer);
|
||||
Serializer.Serialize(jsonWriter, p_data);
|
||||
jsonWriter.Close();
|
||||
writer.Close();
|
||||
}
|
||||
}
|
||||
@ -50,7 +50,7 @@ public class Shell
|
||||
|
||||
// Load config.
|
||||
if (ShellDirectory is null) Write("[WARNING] Could not load config from shell location. Defaults will be used.");
|
||||
else ShellConfig.LoadConfig(ShellDirectory);
|
||||
else Config.LoadConfig(ShellDirectory);
|
||||
|
||||
// Load modules and commands.
|
||||
List<Assembly?> possibleAsms = new()
|
||||
@ -254,7 +254,7 @@ public class Shell
|
||||
}
|
||||
|
||||
if (ShellDirectory is null) Write("[WARNING] Could not save config to shell location. Any changes will be ignored.");
|
||||
else ShellConfig.SaveConfig(ShellDirectory);
|
||||
else Config.SaveConfig(ShellDirectory);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user