Estou usando o Viper no Golang para carregar valores de configuração de variáveis de ambiente. No entanto, quero que o viper.Unmarshal retorne um erro se uma variável de ambiente necessária não estiver definida.
Por padrão, se uma variável de ambiente estiver ausente, viper.Unmarshal não falha — ele simplesmente atribui o valor zero ao campo struct.
Aqui está meu código:
package main
import (
"fmt"
"log"
"github.com/spf13/viper"
)
type Config struct {
DatabaseURL string `mapstructure:"DATABASE_URL"`
}
func main() {
viper.AutomaticEnv()
var config Config
if err := viper.Unmarshal(&config); err != nil {
log.Fatalf("Error unmarshaling config: %v", err)
}
fmt.Println("Config:", config)
}
Se DATABASE_URL não estiver definido, config.DatabaseURL será apenas uma string vazia em vez de causar um erro.
Tentei usar viper.BindEnv("DATABASE_URL"), mas o Unmarshal ainda não falha quando DATABASE_URL está ausente.
No Viper, a função Unmarshal aceita hooks por meio de DecoderConfigOption. Olhando para o viper, descobri que a estrutura DecoderConfig tem um campo ErrorUnset:
// If ErrorUnset is true, then it is an error for there to exist
// fields in the result that were not set in the decoding process
// (extra fields). This only applies to decoding to a struct. This
// will affect all nested structs as well.
ErrorUnset bool
No entanto, não tenho certeza de como passar essa configuração corretamente como um hook no Unmarshal. Se alguém souber como habilitar ErrorUnset usando DecoderConfigOption, obrigado!
Como posso fazer com que o viper.Unmarshal DecodeHook retorne um erro se uma variável de ambiente necessária não estiver definida?
Não tenho certeza se minha resposta é como descrita na sua pergunta, mas você pode consultá-la. Você pode usar o código a seguir. Descobri que quando definimos ErrorUnset=true , verificaremos se definimos as variáveis de ambiente necessárias durante o unmarshal.