func unpackWith()

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
}