using BotPages.Core.Abstractions;
using System.Collections.Concurrent;
namespace BotPages.Core.Storage;
///
/// Памятное хранилище состояния.
///
public sealed class InMemoryStateStorage : IStateStorage
{
private readonly ConcurrentDictionary> _store = new();
///
public Task GetAsync(CompositeSessionKey session, string key, CancellationToken ct)
=> Task.FromResult(_store.TryGetValue(session, out var dict) ?
dict.TryGetValue(key, out var obj) ? (T?)obj : default
: default);
///
public Task SetAsync(CompositeSessionKey session, string key, T state, CancellationToken ct)
{
if (!_store.ContainsKey(session))
{
_store[session] = new();
}
_store[session][key] = state!;
return Task.CompletedTask;
}
///
public Task RemoveAsync(CompositeSessionKey session, string key, CancellationToken ct)
=> Task.FromResult(_store.TryGetValue(session, out var dict) ? dict.TryRemove(key, out _) : true);
///
public Task ClearAsync(CompositeSessionKey session, CancellationToken ct)
=> Task.FromResult(_store.TryRemove(session, out _));
}