github.com/ipld/go-ipld-prime@v0.21.0/fluent/fluentBuilder.go (about)

     1  package fluent
     2  
     3  import (
     4  	"github.com/ipld/go-ipld-prime/datamodel"
     5  )
     6  
     7  func Build(np datamodel.NodePrototype, fn func(NodeAssembler)) (datamodel.Node, error) {
     8  	nb := np.NewBuilder()
     9  	fna := WrapAssembler(nb)
    10  	err := Recover(func() {
    11  		fn(fna)
    12  	})
    13  	if err != nil {
    14  		return nil, err
    15  	}
    16  	return nb.Build(), nil
    17  }
    18  func BuildMap(np datamodel.NodePrototype, sizeHint int64, fn func(MapAssembler)) (datamodel.Node, error) {
    19  	return Build(np, func(fna NodeAssembler) { fna.CreateMap(sizeHint, fn) })
    20  }
    21  func BuildList(np datamodel.NodePrototype, sizeHint int64, fn func(ListAssembler)) (datamodel.Node, error) {
    22  	return Build(np, func(fna NodeAssembler) { fna.CreateList(sizeHint, fn) })
    23  }
    24  
    25  func MustBuild(np datamodel.NodePrototype, fn func(NodeAssembler)) datamodel.Node {
    26  	nb := np.NewBuilder()
    27  	fn(WrapAssembler(nb))
    28  	return nb.Build()
    29  }
    30  func MustBuildMap(np datamodel.NodePrototype, sizeHint int64, fn func(MapAssembler)) datamodel.Node {
    31  	return MustBuild(np, func(fna NodeAssembler) { fna.CreateMap(sizeHint, fn) })
    32  }
    33  func MustBuildList(np datamodel.NodePrototype, sizeHint int64, fn func(ListAssembler)) datamodel.Node {
    34  	return MustBuild(np, func(fna NodeAssembler) { fna.CreateList(sizeHint, fn) })
    35  }
    36  
    37  func WrapAssembler(na datamodel.NodeAssembler) NodeAssembler {
    38  	return &nodeAssembler{na}
    39  }
    40  
    41  // NodeAssembler is the same as the interface in the core package, except:
    42  // instead of returning errors, any error will cause panic
    43  // (and you can collect these with `fluent.Recover`);
    44  // and all recursive operations take a function as a parameter,
    45  // within which you will receive another {Map,List,}NodeAssembler.
    46  type NodeAssembler interface {
    47  	CreateMap(sizeHint int64, fn func(MapAssembler))
    48  	CreateList(sizeHint int64, fn func(ListAssembler))
    49  	AssignNull()
    50  	AssignBool(bool)
    51  	AssignInt(int64)
    52  	AssignFloat(float64)
    53  	AssignString(string)
    54  	AssignBytes([]byte)
    55  	AssignLink(datamodel.Link)
    56  	AssignNode(datamodel.Node)
    57  
    58  	Prototype() datamodel.NodePrototype
    59  }
    60  
    61  // MapAssembler is the same as the interface in the core package, except:
    62  // instead of returning errors, any error will cause panic
    63  // (and you can collect these with `fluent.Recover`);
    64  // and all recursive operations take a function as a parameter,
    65  // within which you will receive another {Map,List,}NodeAssembler.
    66  type MapAssembler interface {
    67  	AssembleKey() NodeAssembler
    68  	AssembleValue() NodeAssembler
    69  
    70  	AssembleEntry(k string) NodeAssembler
    71  
    72  	KeyPrototype() datamodel.NodePrototype
    73  	ValuePrototype(k string) datamodel.NodePrototype
    74  }
    75  
    76  // ListAssembler is the same as the interface in the core package, except:
    77  // instead of returning errors, any error will cause panic
    78  // (and you can collect these with `fluent.Recover`);
    79  // and all recursive operations take a function as a parameter,
    80  // within which you will receive another {Map,List,}NodeAssembler.
    81  type ListAssembler interface {
    82  	AssembleValue() NodeAssembler
    83  
    84  	ValuePrototype(idx int64) datamodel.NodePrototype
    85  }
    86  
    87  type nodeAssembler struct {
    88  	na datamodel.NodeAssembler
    89  }
    90  
    91  func (fna *nodeAssembler) CreateMap(sizeHint int64, fn func(MapAssembler)) {
    92  	if ma, err := fna.na.BeginMap(sizeHint); err != nil {
    93  		panic(Error{err})
    94  	} else {
    95  		fn(&mapNodeAssembler{ma})
    96  		if err := ma.Finish(); err != nil {
    97  			panic(Error{err})
    98  		}
    99  	}
   100  }
   101  func (fna *nodeAssembler) CreateList(sizeHint int64, fn func(ListAssembler)) {
   102  	if la, err := fna.na.BeginList(sizeHint); err != nil {
   103  		panic(Error{err})
   104  	} else {
   105  		fn(&listNodeAssembler{la})
   106  		if err := la.Finish(); err != nil {
   107  			panic(Error{err})
   108  		}
   109  	}
   110  }
   111  func (fna *nodeAssembler) AssignNull() {
   112  	if err := fna.na.AssignNull(); err != nil {
   113  		panic(Error{err})
   114  	}
   115  }
   116  func (fna *nodeAssembler) AssignBool(v bool) {
   117  	if err := fna.na.AssignBool(v); err != nil {
   118  		panic(Error{err})
   119  	}
   120  }
   121  func (fna *nodeAssembler) AssignInt(v int64) {
   122  	if err := fna.na.AssignInt(v); err != nil {
   123  		panic(Error{err})
   124  	}
   125  }
   126  func (fna *nodeAssembler) AssignFloat(v float64) {
   127  	if err := fna.na.AssignFloat(v); err != nil {
   128  		panic(Error{err})
   129  	}
   130  }
   131  func (fna *nodeAssembler) AssignString(v string) {
   132  	if err := fna.na.AssignString(v); err != nil {
   133  		panic(Error{err})
   134  	}
   135  }
   136  func (fna *nodeAssembler) AssignBytes(v []byte) {
   137  	if err := fna.na.AssignBytes(v); err != nil {
   138  		panic(Error{err})
   139  	}
   140  }
   141  func (fna *nodeAssembler) AssignLink(v datamodel.Link) {
   142  	if err := fna.na.AssignLink(v); err != nil {
   143  		panic(Error{err})
   144  	}
   145  }
   146  func (fna *nodeAssembler) AssignNode(v datamodel.Node) {
   147  	if err := fna.na.AssignNode(v); err != nil {
   148  		panic(Error{err})
   149  	}
   150  }
   151  func (fna *nodeAssembler) Prototype() datamodel.NodePrototype {
   152  	return fna.na.Prototype()
   153  }
   154  
   155  type mapNodeAssembler struct {
   156  	ma datamodel.MapAssembler
   157  }
   158  
   159  func (fma *mapNodeAssembler) AssembleKey() NodeAssembler {
   160  	return &nodeAssembler{fma.ma.AssembleKey()}
   161  }
   162  func (fma *mapNodeAssembler) AssembleValue() NodeAssembler {
   163  	return &nodeAssembler{fma.ma.AssembleValue()}
   164  }
   165  func (fma *mapNodeAssembler) AssembleEntry(k string) NodeAssembler {
   166  	va, err := fma.ma.AssembleEntry(k)
   167  	if err != nil {
   168  		panic(Error{err})
   169  	}
   170  	return &nodeAssembler{va}
   171  }
   172  func (fma *mapNodeAssembler) KeyPrototype() datamodel.NodePrototype {
   173  	return fma.ma.KeyPrototype()
   174  }
   175  func (fma *mapNodeAssembler) ValuePrototype(k string) datamodel.NodePrototype {
   176  	return fma.ma.ValuePrototype(k)
   177  }
   178  
   179  type listNodeAssembler struct {
   180  	la datamodel.ListAssembler
   181  }
   182  
   183  func (fla *listNodeAssembler) AssembleValue() NodeAssembler {
   184  	return &nodeAssembler{fla.la.AssembleValue()}
   185  }
   186  func (fla *listNodeAssembler) ValuePrototype(idx int64) datamodel.NodePrototype {
   187  	return fla.la.ValuePrototype(idx)
   188  }