Merge branch 'master' of git.curoverse.com:arvados into 3408-production-datamanager
[arvados.git] / sdk / go / blockdigest / blockdigest.go
1 /* Stores a Block Locator Digest compactly. Can be used as a map key. */
2
3 package blockdigest
4
5 import (
6         "fmt"
7         "log"
8         "strconv"
9 )
10
11 // Stores a Block Locator Digest compactly, up to 128 bits.
12 // Can be used as a map key.
13 type BlockDigest struct {
14         h uint64
15         l uint64
16 }
17
18 func (d *BlockDigest) ToString() (s string) {
19         return fmt.Sprintf("%016x%016x", d.h, d.l)
20 }
21
22 // Will create a new BlockDigest unless an error is encountered.
23 func FromString(s string) (dig BlockDigest, err error) {
24         if len(s) != 32 {
25                 err = fmt.Errorf("Block digest should be exactly 32 characters but this one is %d: %s", len(s), s)
26                 return
27         }
28
29         var d BlockDigest
30         d.h, err = strconv.ParseUint(s[:16], 16, 64)
31         if err != nil {return}
32         d.l, err = strconv.ParseUint(s[16:], 16, 64)
33         if err != nil {return}
34         dig = d
35         return
36 }
37
38 // Will fatal with the error if an error is encountered
39 func AssertFromString(s string) BlockDigest {
40         d, err := FromString(s)
41         if err != nil {
42                 log.Fatalf("Error creating BlockDigest from %s: %v", s, err)
43         }
44         return d
45 }