Files
GameJamDungeon/Zennysoft.Game.Godot.Implementation/Save/SaveFileManager.cs

82 lines
2.6 KiB
C#

using Chickensoft.Collections;
using Chickensoft.Serialization.Godot;
using Chickensoft.Serialization;
using Godot;
using System.IO.Abstractions;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using Zennysoft.Game.Abstractions;
namespace Zennysoft.Game.Implementation;
public class SaveFileManager : ISaveFileManager
{
private readonly IFileSystem _fileSystem;
private string _defaultSaveLocation;
public const string DEFAULT_SAVE_FILE_NAME = "game.json";
public SaveFileManager(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
_defaultSaveLocation = _fileSystem.Path.Join(OS.GetUserDataDir(), DEFAULT_SAVE_FILE_NAME);
GodotSerialization.Setup();
Serializer.AddConverter(new Texture2DConverter());
}
public Task<T?> ReadFromFile<T>(params IJsonTypeInfoResolver?[] resolvers)
{
if (!_fileSystem.File.Exists(_defaultSaveLocation))
throw new FileNotFoundException();
return ReadFromFile<T>(_defaultSaveLocation, resolvers);
}
public async Task<T?> ReadFromFile<T>(string filePath, params IJsonTypeInfoResolver?[] resolvers)
{
if (!_fileSystem.File.Exists(filePath))
throw new FileNotFoundException();
var json = await _fileSystem.File.ReadAllTextAsync(filePath);
var resolver = new SerializableTypeResolver();
var upgradeDependencies = new Blackboard();
var jsonOptions = new JsonSerializerOptions
{
Converters = {
new SerializableTypeConverter(upgradeDependencies)
},
WriteIndented = true
};
jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]);
return JsonSerializer.Deserialize<T?>(json, jsonOptions);
}
public Task WriteToFile<T>(T gameData, params IJsonTypeInfoResolver?[] resolvers)
{
return WriteToFile(gameData, _defaultSaveLocation, resolvers);
}
public async Task WriteToFile<T>(T gameData, string filePath, params IJsonTypeInfoResolver?[] resolvers)
{
var resolver = new SerializableTypeResolver();
var upgradeDependencies = new Blackboard();
var jsonOptions = new JsonSerializerOptions
{
Converters = {
new SerializableTypeConverter(upgradeDependencies)
},
WriteIndented = true
};
jsonOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine([resolver, .. resolvers]);
var json = JsonSerializer.Serialize(gameData, jsonOptions);
await _fileSystem.File.WriteAllTextAsync(filePath, json);
}
public void DeleteSaveData() => DeleteSaveData(_defaultSaveLocation);
public void DeleteSaveData(string filePath) => _fileSystem.File.Delete(filePath);
}