github.com/storacha/go-ucanto@v0.7.2/core/ipld/lib.go (about) 1 package ipld 2 3 import ( 4 "errors" 5 6 "github.com/ipld/go-ipld-prime" 7 "github.com/ipld/go-ipld-prime/node/bindnode" 8 "github.com/ipld/go-ipld-prime/schema" 9 "github.com/storacha/go-ucanto/core/ipld/block" 10 ) 11 12 type Link = ipld.Link 13 type Block = block.Block 14 type Node = ipld.Node 15 16 // Builder can be modeled as an IPLD data and provides a `ToIPLD` method to 17 // build itself into a `datamodel.Node`. 18 type Builder interface { 19 ToIPLD() (Node, error) 20 } 21 22 // WrapWithRecovery behaves like bindnode.Wrap but converts panics into errors 23 func WrapWithRecovery(ptrVal interface{}, typ schema.Type, opts ...bindnode.Option) (nd Node, err error) { 24 defer func() { 25 if r := recover(); r != nil { 26 if asStr, ok := r.(string); ok { 27 err = errors.New(asStr) 28 } else if asErr, ok := r.(error); ok { 29 err = asErr 30 } else { 31 err = errors.New("unknown panic building node") 32 } 33 } 34 }() 35 nd = bindnode.Wrap(ptrVal, typ, opts...) 36 return 37 }