Skip to content

Commit e535a63

Browse files
committed
Simplify custom serialization of Either, EitherOrNone and Option
1 parent 2810b91 commit e535a63

File tree

3 files changed

+22
-109
lines changed

3 files changed

+22
-109
lines changed

Core/Cleipnir.ResilientFunctions/Reactive/Utilities/Either.cs

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -107,29 +107,14 @@ public enum Value : byte
107107

108108
public byte[] Serialize(ISerializer serializer)
109109
{
110-
var valueSpecified = (byte) ValueSpecified;
111-
byte[] valueBytes;
112-
if (ValueSpecified == Value.First)
113-
valueBytes = serializer.Serialize(_first);
114-
else if (ValueSpecified == Value.Second)
115-
valueBytes = serializer.Serialize(_second);
116-
else
117-
throw new SerializationException("Unexpected ValueSpecified-value");
118-
119-
var bytes = new byte[valueBytes.Length + 1];
120-
bytes[0] = valueSpecified;
121-
valueBytes.CopyTo(bytes, index: 1);
122-
return bytes;
110+
var tuple = Tuple.Create((byte)ValueSpecified, _first, _second);
111+
return serializer.Serialize(tuple);
123112
}
124113

125114
public static object Deserialize(byte[] bytes, ISerializer serializer)
126115
{
127-
if (bytes[0] == 1)
128-
return CreateFirst(serializer.Deserialize<T1>(bytes[1..]));
129-
if(bytes[0] == 2)
130-
return CreateSecond(serializer.Deserialize<T2>(bytes[1..]));
131-
132-
throw new SerializationException("Unexpected byte value");
116+
var (valueSpecified, t1, t2) = serializer.Deserialize<Tuple<byte, T1, T2>>(bytes);
117+
return new Either<T1, T2>((Value) valueSpecified, t1, t2);
133118
}
134119
}
135120

@@ -240,34 +225,16 @@ public enum Value : byte
240225
public static Either<T1, T2, T3> CreateFirst(T1 first) => new(Value.First, first, second: default!, third: default!);
241226
public static Either<T1, T2, T3> CreateSecond(T2 second) => new(Value.Second, first: default!, second, third: default!);
242227
public static Either<T1, T2, T3> CreateThird(T3 third) => new(Value.Third, first: default!, second: default!, third);
228+
243229
public byte[] Serialize(ISerializer serializer)
244230
{
245-
var valueSpecified = (byte) ValueSpecified;
246-
byte[] valueBytes;
247-
if (ValueSpecified == Value.First)
248-
valueBytes = serializer.Serialize(_first);
249-
else if (ValueSpecified == Value.Second)
250-
valueBytes = serializer.Serialize(_second);
251-
else if (ValueSpecified == Value.Third)
252-
valueBytes = serializer.Serialize(_third);
253-
else
254-
throw new SerializationException("Unexpected ValueSpecified-value");
255-
256-
var bytes = new byte[valueBytes.Length + 1];
257-
bytes[0] = valueSpecified;
258-
valueBytes.CopyTo(bytes, index: 1);
259-
return bytes;
231+
var tuple = Tuple.Create((byte)ValueSpecified, _first, _second, _third);
232+
return serializer.Serialize(tuple);
260233
}
261234

262235
public static object Deserialize(byte[] bytes, ISerializer serializer)
263236
{
264-
if (bytes[0] == 1)
265-
return CreateFirst(serializer.Deserialize<T1>(bytes[1..]));
266-
if(bytes[0] == 2)
267-
return CreateSecond(serializer.Deserialize<T2>(bytes[1..]));
268-
if(bytes[0] == 3)
269-
return CreateThird(serializer.Deserialize<T3>(bytes[1..]));
270-
271-
throw new SerializationException("Unexpected byte value");
237+
var (valueSpecified, t1, t2, t3) = serializer.Deserialize<Tuple<byte, T1, T2, T3>>(bytes);
238+
return new Either<T1, T2, T3>((Value) valueSpecified, t1, t2, t3);
272239
}
273240
}

Core/Cleipnir.ResilientFunctions/Reactive/Utilities/EitherOrNone.cs

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -123,33 +123,14 @@ public static EitherOrNone<T1, T2> CreateFromEither(Either<T1, T2> either) =>
123123

124124
public byte[] Serialize(ISerializer serializer)
125125
{
126-
var valueSpecified = (byte) ValueSpecified;
127-
byte[] valueBytes;
128-
if (ValueSpecified == Value.None)
129-
return [0];
130-
if (ValueSpecified == Value.First)
131-
valueBytes = serializer.Serialize(_first);
132-
else if (ValueSpecified == Value.Second)
133-
valueBytes = serializer.Serialize(_second);
134-
else
135-
throw new SerializationException("Unexpected ValueSpecified-value");
136-
137-
var bytes = new byte[valueBytes.Length + 1];
138-
bytes[0] = valueSpecified;
139-
valueBytes.CopyTo(bytes, index: 1);
140-
return bytes;
126+
var tuple = Tuple.Create((byte)ValueSpecified, _first, _second);
127+
return serializer.Serialize(tuple);
141128
}
142129

143130
public static object Deserialize(byte[] bytes, ISerializer serializer)
144131
{
145-
if (bytes[0] == 0)
146-
return CreateNone();
147-
if (bytes[0] == 1)
148-
return CreateFirst(serializer.Deserialize<T1>(bytes[1..]));
149-
if(bytes[0] == 2)
150-
return CreateSecond(serializer.Deserialize<T2>(bytes[1..]));
151-
152-
throw new SerializationException("Unexpected byte value");
132+
var (valueSpecified, t1, t2) = serializer.Deserialize<Tuple<byte, T1, T2>>(bytes);
133+
return new EitherOrNone<T1, T2>((Value) valueSpecified, t1, t2);
153134
}
154135
}
155136

@@ -296,36 +277,13 @@ public enum Value
296277

297278
public byte[] Serialize(ISerializer serializer)
298279
{
299-
var valueSpecified = (byte) ValueSpecified;
300-
byte[] valueBytes;
301-
if (ValueSpecified == Value.None)
302-
return [0];
303-
if (ValueSpecified == Value.First)
304-
valueBytes = serializer.Serialize(_first);
305-
else if (ValueSpecified == Value.Second)
306-
valueBytes = serializer.Serialize(_second);
307-
else if (ValueSpecified == Value.Third)
308-
valueBytes = serializer.Serialize(_third);
309-
else
310-
throw new SerializationException("Unexpected ValueSpecified-value");
311-
312-
var bytes = new byte[valueBytes.Length + 1];
313-
bytes[0] = valueSpecified;
314-
valueBytes.CopyTo(bytes, index: 1);
315-
return bytes;
280+
var tuple = Tuple.Create((byte)ValueSpecified, _first, _second, _third);
281+
return serializer.Serialize(tuple);
316282
}
317283

318284
public static object Deserialize(byte[] bytes, ISerializer serializer)
319285
{
320-
if (bytes[0] == 0)
321-
return CreateNone();
322-
if (bytes[0] == 1)
323-
return CreateFirst(serializer.Deserialize<T1>(bytes[1..]));
324-
if(bytes[0] == 2)
325-
return CreateSecond(serializer.Deserialize<T2>(bytes[1..]));
326-
if(bytes[0] == 3)
327-
return CreateThird(serializer.Deserialize<T3>(bytes[1..]));
328-
329-
throw new SerializationException("Unexpected byte value");
286+
var (valueSpecified, t1, t2, t3) = serializer.Deserialize<Tuple<byte, T1, T2, T3>>(bytes);
287+
return new EitherOrNone<T1, T2, T3>((Value) valueSpecified, t1, t2, t3);
330288
}
331289
}

Core/Cleipnir.ResilientFunctions/Reactive/Utilities/Option.cs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Text.Json.Serialization;
34
using System.Threading.Tasks;
45
using Cleipnir.ResilientFunctions.CoreRuntime.Serialization;
@@ -30,25 +31,12 @@ public override bool Equals(object? obj)
3031
}
3132
public override int GetHashCode() => !HasValue ? 0 : Value!.GetHashCode();
3233

33-
public byte[] Serialize(ISerializer serializer)
34-
{
35-
if (!HasValue)
36-
return [];
37-
38-
var valueBytes = serializer.Serialize(Value);
39-
var bytes = new byte[valueBytes.Length + 1];
40-
bytes[0] = 1;
41-
valueBytes.CopyTo(bytes, index: 1);
42-
return bytes;
43-
}
44-
34+
public byte[] Serialize(ISerializer serializer)
35+
=> serializer.Serialize(HasValue ? [v] : new List<T>());
4536
public static object Deserialize(byte[] bytes, ISerializer serializer)
4637
{
47-
if (bytes[0] == 0)
48-
return NoValue;
49-
50-
var value = (T) serializer.Deserialize<T>(bytes[1..])!;
51-
return new Option<T>(value, hasValue: true);
38+
var list = serializer.Deserialize<List<T>>(bytes);
39+
return list.Count == 0 ? Option<T>.NoValue : new Option<T>(list[0], hasValue: true);
5240
}
5341
}
5442

0 commit comments

Comments
 (0)