22using Mx . NET . SDK . Core . Domain . Values ;
33using System . Collections . Generic ;
44using System . Linq ;
5- using System . Text ;
65
76namespace Mx . NET . SDK . Core . Domain . Codec
87{
9- public class EnumBinaryCodec : IBinaryCodec
8+ public class EnumBinaryCodec : IBinaryCodec
109 {
1110 private readonly BinaryCodec _binaryCodec ;
1211 public string Type => TypeValue . BinaryTypes . Enum ;
@@ -18,15 +17,33 @@ public EnumBinaryCodec(BinaryCodec binaryCodec)
1817
1918 public ( IBinaryType Value , int BytesLength ) DecodeNested ( byte [ ] data , TypeValue type )
2019 {
21- var fieldDefinitions = type . GetFieldDefinitions ( ) ;
22- var fields = new List < EnumField > ( ) ;
2320 var originalBuffer = data ;
21+ var offset = 0 ;
2422
25- var ( value , bytesLength ) = _binaryCodec . DecodeNested ( data , fieldDefinitions [ 0 ] . Type ) ;
23+ var ( discriminant , lengthOfDiscriminant ) = ReadDiscriminant ( data ) ;
24+ offset += lengthOfDiscriminant ;
25+ data = originalBuffer . Slice ( offset ) ;
2626
27- var index = int . Parse ( value . ToString ( ) ) ;
28- var enumValue = new EnumValue ( type , new EnumField ( fieldDefinitions [ index ] . Name , value ) ) ;
29- return ( enumValue , 1 ) ;
27+ var index = int . Parse ( discriminant . ToString ( ) ) ;
28+ var variantDefinitions = type . GetVariantDefinitions ( ) ;
29+ var fieldDefinitions = variantDefinitions [ index ] . Fields ?? new FieldDefinition [ 0 ] ;
30+ var fields = new List < Field > ( ) ;
31+
32+ foreach ( var fieldDefinition in fieldDefinitions )
33+ {
34+ var ( value , fieldsLength ) = _binaryCodec . DecodeNested ( data , fieldDefinition . Type ) ;
35+ fields . Add ( new Field ( fieldDefinition . Name , value ) ) ;
36+ offset += fieldsLength ;
37+ data = originalBuffer . Slice ( offset ) ;
38+ }
39+
40+ var enumValue = new EnumValue ( type , variantDefinitions [ index ] , fields . ToArray ( ) ) ;
41+ return ( enumValue , offset ) ;
42+ }
43+
44+ private ( IBinaryType Value , int BytesLength ) ReadDiscriminant ( byte [ ] data )
45+ {
46+ return _binaryCodec . DecodeNested ( data , TypeValue . U8TypeValue ) ;
3047 }
3148
3249 public IBinaryType DecodeTopLevel ( byte [ ] data , TypeValue type )
@@ -38,12 +55,40 @@ public IBinaryType DecodeTopLevel(byte[] data, TypeValue type)
3855 public byte [ ] EncodeNested ( IBinaryType value )
3956 {
4057 var enumValue = value . ValueOf < EnumValue > ( ) ;
41- return Encoding . ASCII . GetBytes ( enumValue . Variant . Discriminant . ToString ( ) ) ;
58+ var buffer = new List < byte [ ] > ( ) ;
59+
60+ var discriminant = new NumericValue ( TypeValue . U8TypeValue , enumValue . Discriminant ) ;
61+ var discriminantBuffer = _binaryCodec . EncodeNested ( discriminant ) ;
62+
63+ buffer . Add ( discriminantBuffer ) ;
64+ foreach ( var field in enumValue . Fields )
65+ {
66+ var fieldBuffer = _binaryCodec . EncodeNested ( field . Value ) ;
67+ buffer . Add ( fieldBuffer ) ;
68+ }
69+
70+ var data = buffer . SelectMany ( s => s ) ;
71+ return data . ToArray ( ) ;
4272 }
4373
4474 public byte [ ] EncodeTopLevel ( IBinaryType value )
4575 {
46- return EncodeNested ( value ) ;
76+ var enumValue = value . ValueOf < EnumValue > ( ) ;
77+ var hasFields = enumValue . Fields ? . Length > 0 ;
78+ var buffer = new List < byte [ ] > ( ) ;
79+
80+ var discriminant = new NumericValue ( TypeValue . U8TypeValue , enumValue . Discriminant ) ;
81+ var discriminantBuffer = hasFields ? _binaryCodec . EncodeNested ( discriminant ) : _binaryCodec . EncodeTopLevel ( discriminant ) ;
82+ buffer . Add ( discriminantBuffer ) ;
83+
84+ foreach ( var field in enumValue . Fields )
85+ {
86+ var fieldBuffer = _binaryCodec . EncodeNested ( field . Value ) ;
87+ buffer . Add ( fieldBuffer ) ;
88+ }
89+
90+ var data = buffer . SelectMany ( s => s ) ;
91+ return data . ToArray ( ) ;
4792 }
4893 }
4994}
0 commit comments