forked from cerc-io/ipld-eth-server
36 lines
910 B
Go
36 lines
910 B
Go
package obj
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/polydawn/refmt/obj/atlas"
|
|
. "github.com/polydawn/refmt/tok"
|
|
)
|
|
|
|
type marshalMachineTransform struct {
|
|
trFunc atlas.MarshalTransformFunc
|
|
delegate MarshalMachine
|
|
tagged bool // Used to apply tag to first step (without forcing delegate to know).
|
|
tag int
|
|
first bool // This resets; 'tagged' persists (because it's type info).
|
|
}
|
|
|
|
func (mach *marshalMachineTransform) Reset(slab *marshalSlab, rv reflect.Value, _ reflect.Type) error {
|
|
tr_rv, err := mach.trFunc(rv)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mach.first = true
|
|
return mach.delegate.Reset(slab, tr_rv, tr_rv.Type())
|
|
}
|
|
|
|
func (mach *marshalMachineTransform) Step(driver *Marshaller, slab *marshalSlab, tok *Token) (done bool, err error) {
|
|
done, err = mach.delegate.Step(driver, slab, tok)
|
|
if mach.first && mach.tagged {
|
|
tok.Tagged = true
|
|
tok.Tag = mach.tag
|
|
mach.first = false
|
|
}
|
|
return
|
|
}
|