/
result.go
61 lines (50 loc) · 1.05 KB
/
result.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package goscale
/*
Ref: https://spec.polkadot.network/#defn-result-type)
SCALE Result Type.
*/
import (
"bytes"
)
type Result[T Encodable] struct {
HasError Bool
Value T
}
func (r Result[T]) Encode(buffer *bytes.Buffer) error {
err := (r.HasError).Encode(buffer)
if err != nil {
return err
}
err = r.Value.Encode(buffer)
if err != nil {
return err
}
return nil
}
func (r Result[T]) Bytes() []byte {
return EncodedBytes(r)
}
func DecodeResult[T, E Encodable](buffer *bytes.Buffer, decodeValid func(*bytes.Buffer) (T, error), decodeErr func(*bytes.Buffer) (E, error)) (Result[Encodable], error) {
hasError, err := DecodeBool(buffer)
if err != nil {
return Result[Encodable]{}, err
}
if hasError {
value, err := decodeErr(buffer)
if err != nil {
return Result[Encodable]{}, err
}
return Result[Encodable]{
HasError: hasError,
Value: value,
}, nil
}
value, err := decodeValid(buffer)
if err != nil {
return Result[Encodable]{}, err
}
return Result[Encodable]{
HasError: hasError,
Value: value,
}, nil
}