// ExactWithDateUnmarshal is intended to unmarshal a config file into a structure // producing error when extraneous variables are introduced and supporting // the time.Duration type func ExactWithDateUnmarshal(v *viper.Viper, output interface{}) error { baseKeys := v.AllSettings() // AllKeys doesn't actually return all keys, it only returns the base ones leafKeys := getKeysRecursively("", v, baseKeys) logger.Infof("%+v", leafKeys) config := &mapstructure.DecoderConfig{ ErrorUnused: true, Metadata: nil, Result: output, WeaklyTypedInput: true, DecodeHook: customDecodeHook(), } decoder, err := mapstructure.NewDecoder(config) if err != nil { return err } return decoder.Decode(leafKeys) }