Penumbra/Penumbra/Mods/Groups/ModSaveGroup.cs

100 lines
3.4 KiB
C#

using Newtonsoft.Json;
using Penumbra.Mods.SubMods;
using Penumbra.Services;
namespace Penumbra.Mods.Groups;
public readonly struct ModSaveGroup : ISavable
{
public const int CurrentVersion = 0;
private readonly DirectoryInfo _basePath;
private readonly IModGroup? _group;
private readonly int _groupIdx;
private readonly DefaultSubMod? _defaultMod;
private readonly bool _onlyAscii;
private ModSaveGroup(DirectoryInfo basePath, IModGroup group, int groupIndex, bool onlyAscii)
{
_basePath = basePath;
_group = group;
_groupIdx = groupIndex;
_onlyAscii = onlyAscii;
}
public static ModSaveGroup WithoutMod(DirectoryInfo basePath, IModGroup group, int groupIndex, bool onlyAscii)
=> new(basePath, group, groupIndex, onlyAscii);
public ModSaveGroup(IModGroup group, bool onlyAscii)
: this(group.Mod.ModPath, group, group.GetIndex(), onlyAscii)
{ }
public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii)
{
_basePath = basePath;
_groupIdx = -1;
_defaultMod = @default;
_onlyAscii = onlyAscii;
}
public ModSaveGroup(DirectoryInfo basePath, IModDataContainer container, bool onlyAscii)
{
_basePath = basePath;
_defaultMod = container as DefaultSubMod;
_onlyAscii = onlyAscii;
if (_defaultMod != null)
{
_groupIdx = -1;
_group = null;
}
else
{
_group = container.Group!;
_groupIdx = _group.GetIndex();
}
}
public ModSaveGroup(IModDataContainer container, bool onlyAscii)
{
_basePath = (container.Mod as Mod)?.ModPath
?? throw new Exception("Invalid save group from default data container without base path."); // Should not happen.
_defaultMod = container as DefaultSubMod;
_onlyAscii = onlyAscii;
_group = container.Group;
_groupIdx = _group?.GetIndex() ?? -1;
}
public string ToFilename(FilenameService fileNames)
=> fileNames.OptionGroupFile(_basePath.FullName, _groupIdx, _group?.Name ?? string.Empty, _onlyAscii);
public void Save(StreamWriter writer)
{
using var j = new JsonTextWriter(writer);
j.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
j.WriteStartObject();
j.WritePropertyName("Version");
j.WriteValue(CurrentVersion);
if (_groupIdx >= 0)
_group!.WriteJson(j, serializer, _basePath);
else
SubMod.WriteModContainer(j, serializer, _defaultMod!, _basePath);
j.WriteEndObject();
}
public static void WriteJsonBase(JsonTextWriter jWriter, IModGroup group)
{
jWriter.WritePropertyName(nameof(group.Name));
jWriter.WriteValue(group.Name);
jWriter.WritePropertyName(nameof(group.Description));
jWriter.WriteValue(group.Description);
jWriter.WritePropertyName(nameof(group.Image));
jWriter.WriteValue(group.Image);
jWriter.WritePropertyName(nameof(group.Priority));
jWriter.WriteValue(group.Priority.Value);
jWriter.WritePropertyName(nameof(group.Type));
jWriter.WriteValue(group.Type.ToString());
jWriter.WritePropertyName(nameof(group.DefaultSettings));
jWriter.WriteValue(group.DefaultSettings.Value);
}
}