1package models
2
3import (
4 "database/sql/driver"
5 "encoding/json"
6 "fmt"
7 "github.com/ipfs/go-cid"
8)
9
10// NB: copied from my estuary code
11
12type DbCID struct {
13 CID cid.Cid
14}
15
16func (dbc *DbCID) Scan(v interface{}) error {
17 b, ok := v.([]byte)
18 if !ok {
19 return fmt.Errorf("dbcids must get bytes!")
20 }
21
22 if len(b) == 0 {
23 return nil
24 }
25
26 c, err := cid.Cast(b)
27 if err != nil {
28 return err
29 }
30
31 dbc.CID = c
32 return nil
33}
34
35func (dbc DbCID) Value() (driver.Value, error) {
36 if !dbc.CID.Defined() {
37 return nil, fmt.Errorf("cannot serialize undefined cid to database")
38 }
39 return dbc.CID.Bytes(), nil
40}
41
42func (dbc DbCID) MarshalJSON() ([]byte, error) {
43 return json.Marshal(dbc.CID.String())
44}
45
46func (dbc *DbCID) UnmarshalJSON(b []byte) error {
47 var s string
48 if err := json.Unmarshal(b, &s); err != nil {
49 return err
50 }
51
52 c, err := cid.Decode(s)
53 if err != nil {
54 return err
55 }
56
57 dbc.CID = c
58 return nil
59}
60
61func (dbc *DbCID) GormDataType() string {
62 return "bytes"
63}