using System; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; namespace Kruzya.TelegramBot.Core.Option; public class OptionItem : IOptionItem { public IOptionKey Key { get; } public T Value { get => _value; set { _value = value; _isChanged = true; } } public bool IsChanged => _isChanged; private T _value; private bool _isChanged; public OptionItem(IOptionKey key, T value) { Key = key; Value = value; } public async Task LoadAsync(IOptionStorageAdapter adapter) { var savedValue = await adapter.LoadValueAsync(Key); if (savedValue == null) { return; } // This property changed when we're loaded default value. Reset here. _isChanged = false; _value = JsonSerializer.Deserialize(new ReadOnlySpan(savedValue)); } public async Task SaveAsync(IOptionStorageAdapter adapter) { var data = JsonSerializer.SerializeToUtf8Bytes(Value, new JsonSerializerOptions { WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }); await adapter.SaveValueAsync(Key, data); } }