forked from cerc-io/ipld-eth-server
38 lines
1.0 KiB
Go
38 lines
1.0 KiB
Go
package obj
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
. "github.com/polydawn/refmt/tok"
|
|
)
|
|
|
|
/*
|
|
A MarshalMachine that unwraps an `interface{}` value,
|
|
selects the correct machinery for handling its content,
|
|
and delegates immediately to that machine.
|
|
*/
|
|
type marshalMachineWildcard struct {
|
|
delegate MarshalMachine
|
|
}
|
|
|
|
func (mach *marshalMachineWildcard) Reset(slab *marshalSlab, rv reflect.Value, rt reflect.Type) error {
|
|
// If the interface contains nil, go no further; we'll simply yield that single token.
|
|
if rv.IsNil() {
|
|
mach.delegate = nil
|
|
return nil
|
|
}
|
|
// Pick, reset, and retain a delegate machine for the interior type.
|
|
unwrap_rv := rv.Elem() // unwrap iface
|
|
unwrap_rt := unwrap_rv.Type()
|
|
mach.delegate = slab.requisitionMachine(unwrap_rt)
|
|
return mach.delegate.Reset(slab, unwrap_rv, unwrap_rt)
|
|
}
|
|
|
|
func (mach marshalMachineWildcard) Step(driver *Marshaller, slab *marshalSlab, tok *Token) (done bool, err error) {
|
|
if mach.delegate == nil {
|
|
tok.Type = TNull
|
|
return true, nil
|
|
}
|
|
return mach.delegate.Step(driver, slab, tok)
|
|
}
|