// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EpicGames.Core;
using StackExchange.Redis;
namespace EpicGames.Redis
{
///
/// Represents a typed Redis string with a given value type
///
/// The type of element stored in the list
public record struct RedisStringKey(RedisKey Inner) : IRedisTypedKey
{
///
/// Implicit conversion to typed redis key.
///
/// Key to convert
public static implicit operator RedisStringKey(string key) => new RedisStringKey(new RedisKey(key));
}
///
/// Extension methods for strings
///
public static class RedisStringKeyExtensions
{
#region Conditions
///
public static Condition StringEqual(this RedisStringKey key, TElement value)
=> Condition.StringEqual(key.Inner, RedisSerializer.Serialize(value));
///
public static Condition StringLengthEqual(this RedisStringKey key, long length)
=> Condition.StringLengthEqual(key.Inner, length);
///
public static Condition StringLengthGreaterThan(this RedisStringKey key, long length)
=> Condition.StringLengthGreaterThan(key.Inner, length);
///
public static Condition StringLengthLessThan(this RedisStringKey key, long length)
=> Condition.StringLengthLessThan(key.Inner, length);
///
public static Condition StringNotEqual(this RedisStringKey key, TElement value)
=> Condition.StringNotEqual(key.Inner, RedisSerializer.Serialize(value));
#endregion
#region StringDecrementAsync
///
public static Task StringDecrementAsync(this IDatabaseAsync target, RedisKey key, long value = 1L, CommandFlags flags = CommandFlags.None)
{
return target.StringDecrementAsync(key, value, flags);
}
///
public static Task StringDecrementAsync(this IDatabaseAsync target, RedisStringKey key, long value = 1L, CommandFlags flags = CommandFlags.None)
{
return target.StringDecrementAsync(key.Inner, value, flags);
}
///
public static Task StringDecrementAsync(this IDatabaseAsync target, RedisStringKey key, double value = 1.0, CommandFlags flags = CommandFlags.None)
{
return target.StringDecrementAsync(key.Inner, value, flags);
}
#endregion
#region StringGetAsync
///
public static async Task StringGetAsync(this IDatabaseAsync target, RedisStringKey key, CommandFlags flags = CommandFlags.None)
{
RedisValue value = await target.StringGetAsync(key.Inner, flags);
if (value.IsNull)
{
return default;
}
return RedisSerializer.Deserialize(value)!;
}
///
public static async Task StringGetAsync(this IDatabaseAsync target, RedisStringKey key, TValue defaultValue, CommandFlags flags = CommandFlags.None)
{
RedisValue value = await target.StringGetAsync(key.Inner, flags);
if (value.IsNull)
{
return defaultValue;
}
return RedisSerializer.Deserialize(value)!;
}
#endregion
#region StringIncrementAsync
///
public static Task StringIncrementAsync(this IDatabaseAsync target, RedisKey key, long value = 1L, CommandFlags flags = CommandFlags.None)
{
return target.StringIncrementAsync(key, value, flags);
}
///
public static Task StringIncrementAsync(this IDatabaseAsync target, RedisStringKey key, long value = 1L, CommandFlags flags = CommandFlags.None)
{
return target.StringIncrementAsync(key.Inner, value, flags);
}
///
public static Task StringIncrementAsync(this IDatabaseAsync target, RedisKey key, double value, CommandFlags flags = CommandFlags.None)
{
return target.StringIncrementAsync(key, value, flags);
}
///
public static Task StringIncrementAsync(this IDatabaseAsync target, RedisStringKey key, double value = 1.0, CommandFlags flags = CommandFlags.None)
{
return target.StringIncrementAsync(key.Inner, value, flags);
}
#endregion
#region StringLengthAsync
///
public static Task StringLengthAsync(this IDatabaseAsync target, RedisStringKey key, CommandFlags flags = CommandFlags.None)
{
return target.StringLengthAsync(key.Inner, flags);
}
#endregion
#region StringSetAsync
///
public static Task StringSetAsync(this IDatabaseAsync target, RedisStringKey key, TValue value, TimeSpan? expiry = null, When when = When.Always, CommandFlags flags = CommandFlags.None)
{
return target.StringSetAsync(key.Inner, RedisSerializer.Serialize(value), expiry, when, flags);
}
///
public static Task StringSetAsync(this IDatabaseAsync target, KeyValuePair, TValue>[] pairs, When when = When.Always, CommandFlags flags = CommandFlags.None)
{
return target.StringSetAsync(pairs.ConvertAll(x => new KeyValuePair(x.Key.Inner, RedisSerializer.Serialize(x.Value))), when, flags);
}
#endregion
}
}