ipld-eth-server/vendor/github.com/polydawn/refmt/obj/unmarshalTransform.go
Elizabeth Engelman 36533f7c3f Update vendor directory and make necessary code changes
Fixes for new geth version
2019-09-25 16:32:27 -05:00

39 lines
1.3 KiB
Go

package obj
import (
"reflect"
"github.com/polydawn/refmt/obj/atlas"
. "github.com/polydawn/refmt/tok"
)
type unmarshalMachineTransform struct {
trFunc atlas.UnmarshalTransformFunc
recv_rt reflect.Type
delegate UnmarshalMachine // machine for handling the recv type, stepped to completion before transform applied.
target_rv reflect.Value // given on Reset, retained until last step, and set into after using trFunc
recv_rv reflect.Value // if set, handle to slot where slice is stored; content must be placed into target at end.
}
func (mach *unmarshalMachineTransform) Reset(slab *unmarshalSlab, rv reflect.Value, _ reflect.Type) error {
mach.target_rv = rv
mach.recv_rv = reflect.New(mach.recv_rt).Elem() // REVIEW: this behavior with ptr vs not for in_rt. the star-star case is prob not what want.
return mach.delegate.Reset(slab, mach.recv_rv, mach.recv_rt)
}
func (mach *unmarshalMachineTransform) Step(driver *Unmarshaller, slab *unmarshalSlab, tok *Token) (done bool, err error) {
done, err = mach.delegate.Step(driver, slab, tok)
if err != nil {
return
}
if !done {
return
}
// on the last step, use transform, and finally set in real target.
tr_rv, err := mach.trFunc(mach.recv_rv)
// do attempt the set even if error. user may appreciate partial progress.
mach.target_rv.Set(tr_rv)
return true, err
}