2025-04-16 12:18:34 +09:00

102 lines
3.1 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// @module Quick Save for Unity3D
// @author Michael Clayton
// @support clayton.inds+support@gmail.com
//
////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using CI.QuickSave.Core.Serialisers;
using CI.QuickSave.Core.Storage;
using CI.QuickSave.Core.Util;
using Newtonsoft.Json.Linq;
namespace CI.QuickSave
{
public abstract class QuickSaveBase
{
protected JObject _items;
protected string _root;
protected QuickSaveSettings _settings;
/// <summary>
/// Determines whether the specified root exists
/// </summary>
/// <param name="root">The root to check</param>
/// <returns>Does the root exist</returns>
public static bool RootExists(string root) => FileAccess.Exists(FileAccess.GetPathFromBase(root));
/// <summary>
/// Deletes the specified root if it exists
/// </summary>
/// <param name="root">The root to delete</param>
public static void DeleteRoot(string root) => FileAccess.Delete(FileAccess.GetPathFromBase(root));
/// <summary>
/// Determines if the specified key exists
/// </summary>
/// <param name="key">The key to look for</param>
/// <returns>Does the key exist</returns>
public bool Exists(string key) => _items[key] != null;
/// <summary>
/// Gets the names of all the keys under this root
/// </summary>
/// <returns>A collection of key names</returns>
public IEnumerable<string> GetAllKeys() => _items.Properties().Select(x => x.Name).ToList();
protected void Load(bool rootMightNotExist)
{
FileAccess.CreateRootFolder();
var json = FileAccess.LoadString(FileAccess.GetPathFromBase(_root));
if (string.IsNullOrEmpty(json))
{
if (rootMightNotExist)
{
_items = new JObject();
return;
}
throw new QuickSaveException("Root does not exist");
}
json = DataService.PrepareLoadedData(json, _settings);
try
{
_items = JObject.Parse(json);
}
catch (Exception e)
{
throw new QuickSaveException("Deserialisation failed", e);
}
}
protected void Save()
{
string json;
try
{
json = JsonSerialiser.Serialise(_items);
}
catch (Exception e)
{
throw new QuickSaveException("Serialisation failed", e);
}
json = DataService.PrepareSaveData(json, _settings);
FileAccess.CreateRootFolder();
if (!FileAccess.SaveString(FileAccess.GetPathFromBase(_root), json))
{
throw new QuickSaveException("Failed to write to file");
}
}
}
}