Merge branch 'master' into 5383-api-db-current-time
[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) String() 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 {
32                 return
33         }
34         d.l, err = strconv.ParseUint(s[16:], 16, 64)
35         if err != nil {
36                 return
37         }
38         dig = d
39         return
40 }
41
42 // Will fatal with the error if an error is encountered
43 func AssertFromString(s string) BlockDigest {
44         d, err := FromString(s)
45         if err != nil {
46                 log.Fatalf("Error creating BlockDigest from %s: %v", s, err)
47         }
48         return d
49 }