in unpack.go [161:227]
func unpackWith(opts *options, v reflect.Value, with value) Error {
// short circuit nil values
if isNil(with) {
return nil
}
ctx := with.Context()
meta := with.meta()
var err error
value := v.Interface()
switch u := value.(type) {
case Unpacker:
var reified interface{}
if reified, err = with.reify(opts); err == nil {
err = u.Unpack(reified)
}
case BoolUnpacker:
var b bool
if b, err = with.toBool(opts); err == nil {
err = u.Unpack(b)
}
case IntUnpacker:
var n int64
if n, err = with.toInt(opts); err == nil {
err = u.Unpack(n)
}
case UintUnpacker:
var n uint64
if n, err = with.toUint(opts); err == nil {
err = u.Unpack(n)
}
case FloatUnpacker:
var f float64
if f, err = with.toFloat(opts); err == nil {
err = u.Unpack(f)
}
case StringUnpacker:
var s string
if s, err = with.toString(opts); err == nil {
err = u.Unpack(s)
}
case ConfigUnpacker:
var c *Config
if c, err = with.toConfig(opts); err == nil {
err = u.Unpack(c)
}
default:
var c *Config
if c, err = with.toConfig(opts); err == nil {
err = reflectUnpackWithConfig(v, c)
}
}
if err != nil {
return raisePathErr(err, meta, "", ctx.path("."))
}
return nil
}