using System.Collections.Generic; using System.Collections.ObjectModel; namespace game.PlayerDataStorage { public enum PlayerKVError { None, Validation, Unauthorized, Http, Network, Timeout, Cancelled, Protocol } public sealed class PlayerKVResult { public bool Success => Error == PlayerKVError.None; public PlayerKVError Error { get; } public int? StatusCode { get; } // Only a successful Get has Data. Failure must never look like an empty save. public IReadOnlyDictionary Data { get; } // A failed write that entered the transport may already have reached the server. // This is conservative, including HTTP failures. Do not blindly replay the write. public bool MayHaveCommitted { get; } internal PlayerKVResult(PlayerKVError error, int? statusCode = null, Dictionary data = null, bool mayHaveCommitted = false) { Error = error; StatusCode = statusCode; Data = data == null ? null : new ReadOnlyDictionary(data); MayHaveCommitted = mayHaveCommitted; } } }