1package util
2
3import (
4 "fmt"
5 "io"
6)
7
8type Hash string
9
10func (h Hash) String() string {
11 return string(h)
12}
13
14func (h *Hash) UnmarshalGQL(v interface{}) error {
15 _, ok := v.(string)
16 if !ok {
17 return fmt.Errorf("labels must be strings")
18 }
19
20 *h = v.(Hash)
21
22 if !h.IsValid() {
23 return fmt.Errorf("invalid hash")
24 }
25
26 return nil
27}
28
29func (h Hash) MarshalGQL(w io.Writer) {
30 w.Write([]byte(`"` + h.String() + `"`))
31}
32
33func (h *Hash) IsValid() bool {
34 if len(*h) != 40 {
35 return false
36 }
37 for _, r := range *h {
38 if (r < 'a' || r > 'z') && (r < '0' || r > '9') {
39 return false
40 }
41 }
42 return true
43}