// 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 } }