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 }