-
Notifications
You must be signed in to change notification settings - Fork 12
/
version_and_hash.go
42 lines (34 loc) · 1.32 KB
/
version_and_hash.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
package model
import (
"github.com/iotaledger/hive.go/ierrors"
"github.com/iotaledger/hive.go/lo"
"github.com/iotaledger/hive.go/serializer/v2/byteutils"
"github.com/iotaledger/hive.go/stringify"
iotago "github.com/iotaledger/iota.go/v4"
)
const VersionAndHashSize = iotago.VersionLength + iotago.IdentifierLength
type VersionAndHash struct {
Version iotago.Version `serix:""`
Hash iotago.Identifier `serix:""`
}
func (v VersionAndHash) Bytes() ([]byte, error) {
// iotago.Version and iotago.Identifier can't panic on .Bytes() call.
return byteutils.ConcatBytes(lo.PanicOnErr(v.Version.Bytes()), lo.PanicOnErr(v.Hash.Bytes())), nil
}
func VersionAndHashFromBytes(bytes []byte) (VersionAndHash, int, error) {
version, versionBytesConsumed, err := iotago.VersionFromBytes(bytes)
if err != nil {
return VersionAndHash{}, 0, ierrors.Wrap(err, "failed to parse version")
}
hash, hashBytesConsumed, err := iotago.IdentifierFromBytes(bytes[versionBytesConsumed:])
if err != nil {
return VersionAndHash{}, 0, ierrors.Wrap(err, "failed to parse hash")
}
return VersionAndHash{version, hash}, versionBytesConsumed + hashBytesConsumed, nil
}
func (v VersionAndHash) String() string {
return stringify.Struct("VersionAndHash",
stringify.NewStructField("Version", byte(v.Version)),
stringify.NewStructField("Hash", v.Hash),
)
}