Skip to content

Commit 685282d

Browse files
Merge pull request #58 from RemarkableTools/dev
Dev
2 parents fcd05b0 + da4fe44 commit 685282d

File tree

16 files changed

+231
-76
lines changed

16 files changed

+231
-76
lines changed

src/Mx.NET.SDK.Core/Domain/Abi/Abi.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class Variant
3030
{
3131
public string Name { get; set; }
3232
public int Discriminant { get; set; }
33+
public Field[] Fields { get; set; }
3334
}
3435

3536
public class Endpoint

src/Mx.NET.SDK.Core/Domain/Abi/AbiDefinition.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,18 @@ private TypeValue GetTypeValue(string type)
6767
return TypeValue.EnumValue(typeFromStruct.Type,
6868
typeFromStruct.Variants?
6969
.ToList()
70-
.Select(c => new FieldDefinition(c.Name, "", GetTypeValue(TypeValue.FromRustType("Enum").RustType)))
70+
.Select(v => new VariantDefinition(v.Name, "", v.Discriminant, v.Fields?
71+
.ToList()
72+
.Select(f=> new FieldDefinition(f.Name, "", GetTypeValue(f.Type)))
73+
.ToArray()))
7174
.ToArray());
7275
}
7376
else if (typeFromStruct.Type == "struct")
7477
{
7578
return TypeValue.StructValue(typeFromStruct.Type,
7679
typeFromStruct.Fields?
7780
.ToList()
78-
.Select(c => new FieldDefinition(c.Name, "", GetTypeValue(c.Type)))
81+
.Select(f => new FieldDefinition(f.Name, "", GetTypeValue(f.Type)))
7982
.ToArray());
8083

8184
}

src/Mx.NET.SDK.Core/Domain/Codec/EnumBinaryCodec.cs

Lines changed: 55 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22
using Mx.NET.SDK.Core.Domain.Values;
33
using System.Collections.Generic;
44
using System.Linq;
5-
using System.Text;
65

76
namespace 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
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Mx.NET.SDK.Core.Domain.Values;
2+
3+
namespace Mx.NET.SDK.Core.Domain.Codec
4+
{
5+
public class StringBinaryCodec : IBinaryCodec
6+
{
7+
private readonly BytesBinaryCodec _bytesBinaryCodec;
8+
9+
public StringBinaryCodec()
10+
{
11+
_bytesBinaryCodec = new BytesBinaryCodec();
12+
}
13+
public string Type => TypeValue.BinaryTypes.String;
14+
15+
public (IBinaryType Value, int BytesLength) DecodeNested(byte[] data, TypeValue type)
16+
{
17+
var (value, bytesLength) = _bytesBinaryCodec.DecodeNested(data, type);
18+
return (StringValue.FromUtf8(value.ValueOf<StringValue>().ToString()), bytesLength);
19+
}
20+
21+
public IBinaryType DecodeTopLevel(byte[] data, TypeValue type)
22+
{
23+
return new StringValue(data, type);
24+
}
25+
26+
public byte[] EncodeNested(IBinaryType value)
27+
{
28+
var stringValueObject = value.ValueOf<StringValue>();
29+
var buffer = BytesValue.FromUtf8(stringValueObject.ToString());
30+
31+
return _bytesBinaryCodec.EncodeNested(buffer);
32+
}
33+
34+
public byte[] EncodeTopLevel(IBinaryType value)
35+
{
36+
var bytes = value.ValueOf<StringValue>();
37+
return bytes.Buffer;
38+
}
39+
}
40+
}

src/Mx.NET.SDK.Core/Domain/Codec/StructBinaryCodec.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ public StructBinaryCodec(BinaryCodec binaryCodec)
1818
public (IBinaryType Value, int BytesLength) DecodeNested(byte[] data, TypeValue type)
1919
{
2020
var fieldDefinitions = type.GetFieldDefinitions();
21-
var fields = new List<StructField>();
21+
var fields = new List<Field>();
2222
var originalBuffer = data;
2323
var offset = 0;
2424

2525
foreach (var fieldDefinition in fieldDefinitions)
2626
{
27-
var (value, bytesLength) = _binaryCodec.DecodeNested(data, fieldDefinition.Type);
28-
fields.Add(new StructField(fieldDefinition.Name, value));
29-
offset += bytesLength;
27+
var (value, fieldsLength) = _binaryCodec.DecodeNested(data, fieldDefinition.Type);
28+
fields.Add(new Field(fieldDefinition.Name, value));
29+
offset += fieldsLength;
3030
data = originalBuffer.Slice(offset);
3131
}
3232

@@ -43,16 +43,15 @@ public IBinaryType DecodeTopLevel(byte[] data, TypeValue type)
4343
public byte[] EncodeNested(IBinaryType value)
4444
{
4545
var structValue = value.ValueOf<StructValue>();
46-
var buffers = new List<byte[]>();
47-
var fields = structValue.Fields;
46+
var fieldsBuffer = new List<byte[]>();
4847

49-
foreach (var field in fields)
48+
foreach (var field in structValue.Fields)
5049
{
5150
var fieldBuffer = _binaryCodec.EncodeNested(field.Value);
52-
buffers.Add(fieldBuffer);
51+
fieldsBuffer.Add(fieldBuffer);
5352
}
5453

55-
var data = buffers.SelectMany(s => s);
54+
var data = fieldsBuffer.SelectMany(s => s);
5655
return data.ToArray();
5756
}
5857

src/Mx.NET.SDK.Core/Domain/Values/BytesValue.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ namespace Mx.NET.SDK.Core.Domain.Values
55
{
66
public class BytesValue : BaseBinaryValue
77
{
8-
public BytesValue(byte[] data, TypeValue type)
9-
: base(type)
8+
public BytesValue(byte[] data, TypeValue type) : base(type)
109
{
1110
Buffer = data;
1211
}

src/Mx.NET.SDK.Core/Domain/Values/ESDTIdentifierValue.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ namespace Mx.NET.SDK.Core.Domain.Values
55
{
66
public class ESDTIdentifierValue : BaseBinaryValue
77
{
8+
public string Value { get; }
9+
public byte[] Buffer { get; }
10+
811
public ESDTIdentifierValue(byte[] data, TypeValue type) : base(type)
912
{
1013
Buffer = data;
1114
Value = Encoding.UTF8.GetString(data);
1215
}
1316

14-
public string Value { get; }
15-
16-
public byte[] Buffer { get; }
17-
1817
public static ESDTIdentifierValue From(byte[] data)
1918
{
2019
return new ESDTIdentifierValue(data, TypeValue.TokenIdentifierValue);

src/Mx.NET.SDK.Core/Domain/Values/EnumField.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
using Mx.NET.SDK.Core.Domain.Helper;
2+
using System.Linq;
23

34
namespace Mx.NET.SDK.Core.Domain.Values
45
{
56
public class EnumValue : BaseBinaryValue
67
{
7-
public EnumField Variant { get; }
8+
public string Name { get; }
9+
public int Discriminant { get; }
10+
public Field[] Fields { get; }
811

9-
public EnumValue(TypeValue enumType, EnumField variant) : base(enumType)
12+
public EnumValue(TypeValue enumType, VariantDefinition variant, Field[] fields) : base(enumType)
1013
{
11-
Variant = variant;
14+
Name = variant.Name;
15+
Discriminant = variant.Discriminant;
16+
Fields = fields;
1217
}
1318

1419
public override string ToString()
1520
{
16-
return Variant.Name;
21+
return Discriminant.ToString();
1722
}
1823

1924
public override T ToObject<T>()
@@ -23,7 +28,7 @@ public override T ToObject<T>()
2328

2429
public override string ToJson()
2530
{
26-
return JsonUnqtWrapper.Serialize(Variant.Discriminant.ToJson());
31+
return JsonUnqtWrapper.Serialize((Name, Fields?.Select(f => f.Value.ToJson())));
2732
}
2833
}
2934
}

src/Mx.NET.SDK.Core/Domain/Values/StructField.cs renamed to src/Mx.NET.SDK.Core/Domain/Values/Field.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
namespace Mx.NET.SDK.Core.Domain.Values
22
{
3-
public class StructField
3+
public class Field
44
{
5-
public IBinaryType Value { get; }
65
public string Name { get; }
6+
public IBinaryType Value { get; }
77

8-
public StructField(string name, IBinaryType value)
8+
public Field(string name, IBinaryType value)
99
{
10-
Value = value;
1110
Name = name;
11+
Value = value;
1212
}
1313

1414
public override string ToString()

0 commit comments

Comments
 (0)