@@ -1059,7 +1059,7 @@ impl<'a, T: Value<'a>> Value<'a> for Option<T> {
10591059 fn serialize_into ( & self , buffer : & mut [ u8 ] ) -> Result < usize , SerializationError > {
10601060 if let Some ( val) = self {
10611061 <bool as Value >:: serialize_into ( & true , buffer) ?;
1062- <T as Value >:: serialize_into ( val, buffer)
1062+ <T as Value >:: serialize_into ( val, & mut buffer[ 1 .. ] ) . map ( |len| len + 1 )
10631063 } else {
10641064 <bool as Value >:: serialize_into ( & false , buffer)
10651065 }
@@ -1070,7 +1070,7 @@ impl<'a, T: Value<'a>> Value<'a> for Option<T> {
10701070 Self : Sized ,
10711071 {
10721072 if <bool as Value >:: deserialize_from ( buffer) ? {
1073- Ok ( Some ( <T as Value >:: deserialize_from ( buffer) ?) )
1073+ Ok ( Some ( <T as Value >:: deserialize_from ( & buffer[ 1 .. ] ) ?) )
10741074 } else {
10751075 Ok ( None )
10761076 }
@@ -1932,4 +1932,19 @@ mod tests {
19321932 . unwrap ( ) ;
19331933 assert_eq ! ( item, & [ 5 , 6 ] ) ;
19341934 }
1935+
1936+ #[ test]
1937+ async fn option_value ( ) {
1938+ let mut buffer = [ 0 ; 2 ] ;
1939+
1940+ assert_eq ! ( Some ( 42u8 ) . serialize_into( & mut buffer) , Ok ( 2 ) ) ;
1941+ assert_eq ! ( Option :: <u8 >:: deserialize_from( & buffer) , Ok ( Some ( 42u8 ) ) ) ;
1942+ assert_eq ! ( buffer, [ 1 , 42 ] ) ;
1943+
1944+ let mut buffer = [ 0 ; 1 ] ;
1945+
1946+ assert_eq ! ( Option :: <u8 >:: None . serialize_into( & mut buffer) , Ok ( 1 ) ) ;
1947+ assert_eq ! ( Option :: <u8 >:: deserialize_from( & buffer) , Ok ( None ) ) ;
1948+ assert_eq ! ( buffer, [ 0 ] ) ;
1949+ }
19351950}
0 commit comments