@@ -1861,6 +1861,75 @@ mod tests {
1861
1861
assert_eq ! ( original, decoded) ;
1862
1862
}
1863
1863
1864
+ #[ test]
1865
+ fn encode_enum_untagged ( ) {
1866
+ #[ derive( Clone , Encode , Decode , PartialEq , Debug ) ]
1867
+ #[ encode( tarantool = "crate" , untagged) ]
1868
+ enum Foo {
1869
+ BarUnit ,
1870
+ BarTuple1 ( bool ) ,
1871
+ BarStruct2 { bar1 : bool , bar2 : String } ,
1872
+ BarTupleN ( usize , [ u8 ; 3 ] , Box < Foo > ) ,
1873
+ }
1874
+
1875
+ // unit variant - encode (ok), decode as array (ok), decode as map (ok)
1876
+ let original = Foo :: BarUnit ;
1877
+ let bytes = encode ( & original) ;
1878
+ assert_value ( & bytes, Value :: Nil ) ;
1879
+ let decoded_arr = Foo :: decode ( & mut bytes. as_slice ( ) , ARR_CTX ) . unwrap ( ) ;
1880
+ assert_eq ! ( decoded_arr, original) ;
1881
+ let decoded_map = Foo :: decode ( & mut bytes. as_slice ( ) , MAP_CTX ) . unwrap ( ) ;
1882
+ assert_eq ! ( decoded_map, original) ;
1883
+
1884
+ // single field unnamed variant - encode (ok), decode as array (ok), decode as map (ok)
1885
+ let original = Foo :: BarTuple1 ( true ) ;
1886
+ let bytes = encode ( & original) ;
1887
+ assert_value ( & bytes, Value :: Array ( vec ! [ Value :: from( true ) ] ) ) ;
1888
+ let decoded_arr = Foo :: decode ( & mut bytes. as_slice ( ) , ARR_CTX ) . unwrap ( ) ;
1889
+ assert_eq ! ( decoded_arr, original) ;
1890
+ let decoded_map = Foo :: decode ( & mut bytes. as_slice ( ) , MAP_CTX ) . unwrap ( ) ;
1891
+ assert_eq ! ( decoded_map, original) ;
1892
+
1893
+ // multi field named variant - encode (ok), decode as array (ok), decode as map (ok)
1894
+ let original = Foo :: BarStruct2 {
1895
+ bar1 : false ,
1896
+ bar2 : "welcome" . to_owned ( ) ,
1897
+ } ;
1898
+ let bytes = encode ( & original) ;
1899
+ assert_value (
1900
+ & bytes,
1901
+ Value :: Array ( vec ! [ Value :: from( false ) , Value :: from( "welcome" ) ] ) ,
1902
+ ) ;
1903
+ let decoded_arr = Foo :: decode ( & mut bytes. as_slice ( ) , ARR_CTX ) . unwrap ( ) ;
1904
+ assert_eq ! ( decoded_arr, original) ;
1905
+ let decoded_map = Foo :: decode ( & mut bytes. as_slice ( ) , MAP_CTX ) . unwrap ( ) ;
1906
+ assert_eq ! ( decoded_map, original) ;
1907
+
1908
+ // complex self-referencing multi field variant - encode (ok), decode as array (ok), decode as map (ok)
1909
+ let original = Foo :: BarTupleN ( 52 , [ 37 , 13 , 42 ] , Box :: new ( Foo :: BarTuple1 ( true ) ) ) ;
1910
+ let bytes = encode ( & original) ;
1911
+ assert_value (
1912
+ & bytes,
1913
+ Value :: Array ( vec ! [
1914
+ Value :: from( 52 ) ,
1915
+ Value :: Array ( vec![ Value :: from( 37 ) , Value :: from( 13 ) , Value :: from( 42 ) ] ) ,
1916
+ Value :: Array ( vec![ Value :: from( true ) ] ) ,
1917
+ ] ) ,
1918
+ ) ;
1919
+ let decoded_arr = Foo :: decode ( & mut bytes. as_slice ( ) , ARR_CTX ) . unwrap ( ) ;
1920
+ assert_eq ! ( decoded_arr, original) ;
1921
+ let decoded_map = Foo :: decode ( & mut bytes. as_slice ( ) , MAP_CTX ) . unwrap ( ) ;
1922
+ assert_eq ! ( decoded_map, original) ;
1923
+
1924
+ // variant mismatch from valid msgpack bytes - decode as array (err), decode as map (err)
1925
+ let mut bytes = Vec :: new ( ) ;
1926
+ rmp:: encode:: write_str ( & mut bytes, "0xDEADBEEF" ) . unwrap ( ) ;
1927
+ let err = Foo :: decode ( & mut bytes. as_slice ( ) , ARR_CTX ) . unwrap_err ( ) ;
1928
+ assert_eq ! ( err. to_string( ) , "failed decoding tarantool::msgpack::encode::tests::encode_enum_untagged::Foo: received stream didn't match any enum variant" ) ;
1929
+ let err = Foo :: decode ( & mut bytes. as_slice ( ) , MAP_CTX ) . unwrap_err ( ) ;
1930
+ assert_eq ! ( err. to_string( ) , "failed decoding tarantool::msgpack::encode::tests::encode_enum_untagged::Foo: received stream didn't match any enum variant" ) ;
1931
+ }
1932
+
1864
1933
#[ test]
1865
1934
fn encode_named_with_raw_ident ( ) {
1866
1935
#[ derive( Clone , Encode , Decode , PartialEq , Debug ) ]
0 commit comments