using System;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using UnityEngine.Assertions;
namespace Ubisoft.Hotel.Cache
{
///
/// Cache driver that converts T to json and viceversa using JsonConvert
///
/// The data type managed by the cache driver. It must be a nullable type.
public class GenericCacheDriver : AbstractCacheDriver
{
public delegate UniTask SyncMethod();
public string Filepath { get; private set; }
public static async UniTask> CreateAsync(string rootFolder, string filePath, CacheSettings settings)
{
Assert.IsFalse(string.IsNullOrEmpty(rootFolder));
GenericCacheDriver driver = new GenericCacheDriver();
driver.RootFolder = rootFolder;
driver.Filepath = filePath;
await driver.InitAsync(settings);
return driver;
}
private GenericCacheDriver()
{
// We can't enforce T to be a nullable type using a generic constraint (such constraint doesn't exist). So instead we do the following JIT compile-time check
if (default(T) != null)
{
throw new InvalidOperationException("GenericCacheDriver requires T to be a nullable type");
}
}
public async UniTask GetDataAsync(string filter = "")
{
string json = await CacheManager.GetDataAsync(GetRelativeCacheFilepath(Filepath), filter);
if (!string.IsNullOrEmpty(json))
{
return JsonConvert.DeserializeObject(json);
}
return default(T); // This should always be null, since T is a nullable type
}
public async UniTask GetCrcAsync(string filter = "")
{
CacheFileMetadata metadata = await CacheManager.GetFileMetadataAsync(GetRelativeCacheFilepath(Filepath), filter);
if(metadata != null)
{
return metadata.Crc;
}
return null;
}
public async UniTask SaveDataAsync(T data, string filter = "")
{
string json = JsonConvert.SerializeObject(data);
await CacheManager.UpdateDataAsync(Filepath, json, filter);
}
public void InvalidateData(string filter = "")
{
CacheManager.InvalidateFile(GetRelativeCacheFilepath(Filepath), filter);
}
}
}