@@ -102,6 +102,8 @@ public static readonly ResultProcessor<Lease<byte>>
102102
103103 public static readonly ResultProcessor < RedisValue [ ] >
104104 RedisValueArray = new RedisValueArrayProcessor ( ) ;
105+ public static readonly ResultProcessor < Lease < RedisValue > ? >
106+ RedisValueLease = new RedisValueLeaseProcessor ( ) ;
105107
106108 public static readonly ResultProcessor < long [ ] >
107109 Int64Array = new Int64ArrayProcessor ( ) ;
@@ -1707,6 +1709,64 @@ protected override bool SetResultCore(PhysicalConnection connection, Message mes
17071709 }
17081710 }
17091711
1712+ private abstract class LeaseProcessor < T > : ResultProcessor < Lease < T > ? >
1713+ {
1714+ protected sealed override bool SetResultCore ( PhysicalConnection connection , Message message , in RawResult result )
1715+ {
1716+ if ( result . Resp2TypeArray != ResultType . Array )
1717+ {
1718+ return false ; // not an array
1719+ }
1720+
1721+ // deal with null
1722+ if ( result . IsNull )
1723+ {
1724+ SetResult ( message , Lease < T > . Empty ) ;
1725+ return true ;
1726+ }
1727+
1728+ // lease and fill
1729+ var items = result . GetItems ( ) ;
1730+ var length = checked ( ( int ) items . Length ) ;
1731+ var lease = Lease < T > . Create ( length , clear : false ) ; // note this handles zero nicely
1732+ var target = lease . Span ;
1733+ int index = 0 ;
1734+ foreach ( ref RawResult item in items )
1735+ {
1736+ if ( ! TryParse ( item , out target [ index ++ ] ) )
1737+ {
1738+ // something went wrong; recycle and quit
1739+ lease . Dispose ( ) ;
1740+ return false ;
1741+ }
1742+ }
1743+ Debug . Assert ( index == length , "length mismatch" ) ;
1744+ SetResult ( message , lease ) ;
1745+ return true ;
1746+ }
1747+
1748+ protected abstract bool TryParse ( in RawResult raw , out T parsed ) ;
1749+ }
1750+
1751+ private sealed class RedisValueLeaseProcessor : LeaseProcessor < RedisValue >
1752+ {
1753+ protected override bool TryParse ( in RawResult raw , out RedisValue parsed )
1754+ {
1755+ parsed = raw . AsRedisValue ( ) ;
1756+ return true ;
1757+ }
1758+ }
1759+
1760+ private sealed class LeaseFloat32Processor : LeaseProcessor < float >
1761+ {
1762+ protected override bool TryParse ( in RawResult raw , out float parsed )
1763+ {
1764+ var result = raw . TryGetDouble ( out double val ) ;
1765+ parsed = ( float ) val ;
1766+ return result ;
1767+ }
1768+ }
1769+
17101770 private sealed class Int64ArrayProcessor : ResultProcessor < long [ ] >
17111771 {
17121772 protected override bool SetResultCore ( PhysicalConnection connection , Message message , in RawResult result )
@@ -2116,47 +2176,6 @@ protected override bool SetResultCore(PhysicalConnection connection, Message mes
21162176 }
21172177 }
21182178
2119- private sealed class LeaseFloat32Processor : ResultProcessor < Lease < float > ? >
2120- {
2121- protected override bool SetResultCore ( PhysicalConnection connection , Message message , in RawResult result )
2122- {
2123- switch ( result . Resp2TypeArray )
2124- {
2125- case ResultType . Array :
2126- if ( result . IsNull )
2127- {
2128- SetResult ( message , null ) ;
2129- return true ;
2130- }
2131-
2132- var items = result . GetItems ( ) ;
2133- if ( items . IsEmpty )
2134- {
2135- SetResult ( message , Lease < float > . Empty ) ;
2136- return true ;
2137- }
2138-
2139- var length = checked ( ( int ) items . Length ) ;
2140- var lease = Lease < float > . Create ( length , clear : false ) ;
2141- var target = lease . Span ;
2142- int index = 0 ;
2143- foreach ( ref RawResult item in items )
2144- {
2145- if ( ! item . TryGetDouble ( out double val ) ) break ;
2146- target [ index ++ ] = ( float ) val ;
2147- }
2148- if ( index == length )
2149- {
2150- SetResult ( message , lease ) ;
2151- return true ;
2152- }
2153- lease . Dispose ( ) ; // something went wrong; recycle
2154- break ;
2155- }
2156- return false ;
2157- }
2158- }
2159-
21602179 private sealed class ScriptResultProcessor : ResultProcessor < RedisResult >
21612180 {
21622181 public override bool SetResult ( PhysicalConnection connection , Message message , in RawResult result )
0 commit comments