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); } } }