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  }