Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }