private static void WriteScalar <T>(PipeWriter writer, T value) where T : struct { var buffer = writer.GetMemory(FormattedSize.Value <T>()); Utf8Converter.TryFormat(value, buffer.Span, out var bytesWritten); writer.Advance(bytesWritten); }
static ValueConversion() { Creator <string> .Implement(v => v == null?(RedisValueObject)RedisNull.Value : new RedisCharString(v)); Creator <byte[]> .Implement(v => v == null?(RedisValueObject)RedisNull.Value : new RedisByteString(v)); Creator <ReadOnlyMemory <byte> > .Implement(v => new RedisByteString(v)); Creator <Memory <byte> > .Implement(v => new RedisByteString(v)); void CreateStringWithUtf8 <T>() where T : struct { Creator <T> .Implement(v => { Memory <byte> buffer = new byte[FormattedSize.Value <T>()]; Utf8Converter.TryFormat(v, buffer.Span, out var bytesWritten); return(new RedisByteString(buffer.Slice(0, bytesWritten))); }); } CreateStringWithUtf8 <int>(); CreateStringWithUtf8 <long>(); CreateStringWithUtf8 <double>(); CreateStringWithUtf8 <Guid>(); Converter <RedisNull, string> .Implement(v => null); Converter <RedisNull, byte[]> .Implement(v => null); void ConvertNullable <T>() where T : struct { Converter <RedisNull, T> .Implement(v => throw new ArgumentNullException(null, "Value is null")); } ConvertNullable <int>(); ConvertNullable <long>(); ConvertNullable <double>(); ConvertNullable <Guid>(); ConvertNullable <bool>(); Converter <RedisByteString, string> .Implement(v => v.ToString()); Converter <RedisByteString, byte[]> .Implement(v => v.Value.ToArray()); void ConvertStringWithUtf8 <T>() { Converter <RedisByteString, T> .Implement(v => Utf8Converter.TryParse(v.Value.Span, out T result, out var bytesRead) && bytesRead == v.Value.Length ?result : throw new FormatException($"String {v} is not valid {typeof(int)}")); } ConvertStringWithUtf8 <int>(); ConvertStringWithUtf8 <long>(); ConvertStringWithUtf8 <double>(); ConvertStringWithUtf8 <Guid>(); Converter <RedisByteString, bool> .Implement(v => v.To <int>() != 0); Converter <RedisCharString, string> .Implement(v => v.Value); Converter <RedisCharString, byte[]> .Implement(v => ProtocolHandler.Encoding.GetBytes(v.Value)); Converter <RedisCharString, int> .Implement(v => Int32.Parse(v.Value)); Converter <RedisCharString, long> .Implement(v => Int64.Parse(v.Value)); Converter <RedisCharString, double> .Implement(v => Double.Parse(v.Value)); Converter <RedisCharString, Guid> .Implement(v => Guid.Parse(v.Value)); Converter <RedisCharString, bool> .Implement(v => v.To <int>() != 0); Converter <RedisInteger, string> .Implement(v => v.ToString()); Converter <RedisInteger, int> .Implement(v => (int)v.Value); Converter <RedisInteger, long> .Implement(v => v.Value); Converter <RedisInteger, double> .Implement(v => v.Value); Converter <RedisInteger, bool> .Implement(v => v.Value != 0); }