code: func decodeFrom(opts *options, src interface{}) Into {
  	return func(dest interface{}) error {
  		var fieldHooks FieldHookFunc
  		hooks := opts.DecodeHooks
  
  		// fieldHook goes first because it may replace the source data map.
  		if len(opts.FieldHooks) > 0 {
  			fieldHooks = composeFieldHooks(opts.FieldHooks)
  		}
  
  		hooks = append(
  			hooks,
  			unmarshalerHook(opts),
  			// durationHook must come before the strconvHook
  			// because the Kind of time.Duration is Int64.
  			durationHook,
  			strconvHook,
  		)
  
  		cfg := mapstructure.DecoderConfig{
  			ErrorUnused:    !opts.IgnoreUnused,
  			Result:         dest,
  			SquashEmbedded: true,
  			DecodeHook: fromDecodeHookFunc(
  				supportPointers(composeDecodeHooks(hooks)),
  			),
  			FieldHook: mapstructure.FieldHookFunc(fieldHooks),
  			TagName:   opts.TagName,
  		}
  
  		decoder, err := mapstructure.NewDecoder(&cfg)
  		if err != nil {
  			return fmt.Errorf("failed to set up decoder: %v", err)
  		}
  
  		if err := decoder.Decode(src); err != nil {
  			if merr, ok := err.(*mapstructure.Error); ok {
  				return multierr.Combine(merr.WrappedErrors()...)
  			}
  			return err
  		}
  
  		return nil
  	}
  }
docs: // decodeFrom builds a decode Into function that reads the given value into
  // the destination.