You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: config.go
    path of file: ./repos/athenapdf/weaver
    
    the code of the file until where you have to start completion: package main

import (
	"os"
	"strconv"
)

// CloudConvert configuration.
type CloudConvert struct {
	// API key to access CloudConvert's API.
	// It can be found in https://cloudconvert.com/user/profile
	APIKey string
	// Base API URL (without backslashes).
	// Defaults to https://api.cloudconvert.com
	APIUrl string
}

// Statsd configuration.
// It contains a HOST:PORT address to a statsd server, and a prefix (namespace)
// for the recorded stats.
type Statsd struct {
	Address string
	Prefix  string
}

// Config for Weaver.
// It contains all the configuration variables that will be used by the
// microservice.
type Config struct {
	CloudConvert
	// Defaults to none.
	Statsd
	// Th
    
func NewEnvConfig() Config {
	// Set defaults
	cloudconvert := CloudConvert{APIUrl: "https://api.cloudconvert.com"}
	conf := Config{
		CloudConvert:       cloudconvert,
		HTTPAddr:           ":8080",
		AuthKey:            "arachnys-weaver",
		AthenaCMD:          "athenapdf -S",
		MaxWorkers:         10,
		MaxConversionQueue: 50,
		WorkerTimeout:      90,
		ConversionFallback: false,
	}

	if httpAddr := os.Getenv("WEAVER_HTTP_ADDR"); httpAddr != "" {
		conf.HTTPAddr = httpAddr
	}

	if httpsAddr := os.Getenv("WEAVER_HTTPS_ADDR"); httpsAddr != "" {
		conf.HTTPSAddr = httpsAddr
	}

	if tlsCertFile := os.Getenv("WEAVER_TLS_CERT_FILE"); tlsCertFile != "" {
		conf.TLSCertFile = tlsCertFile
	}

	if tlsKeyFile := os.Getenv("WEAVER_TLS_KEY_FILE"); tlsKeyFile != "" {
		conf.TLSKeyFile = tlsKeyFile
	}

	if authKey := os.Getenv("WEAVER_AUTH_KEY"); authKey != "" {
		conf.AuthKey = authKey
	}

	if athenaCMD := os.Getenv("WEAVER_ATHENA_CMD"); athenaCMD != "" {
		conf.AthenaCMD = athenaCMD
	}

	// NOTE: we aren't handle the _unlikely_ event of errors properly (they are being suppressed)
	if maxWorkers := os.Getenv("WEAVER_MAX_WORKERS"); maxWorkers != "" {
		conf.MaxWorkers, _ = strconv.Atoi(maxWorkers)
	}

	if maxConversionQueue := os.Getenv("WEAVER_MAX_CONVERSION_QUEUE"); maxConversionQueue != "" {
		conf.MaxConversionQueue, _ = strconv.Atoi(maxConversionQueue)
	}

	if workerTimeout := os.Getenv("WEAVER_WORKER_TIMEOUT"); workerTimeout != "" {
		conf.WorkerTimeout, _ = strconv.Atoi(workerTimeout)
	}

	if conversionFallback := os.Getenv("WEAVER_CONVERSION_FALLBACK"); conversionFallback != "" {
		conf.ConversionFallback, _ = strconv.ParseBool(conversionFallback)
	}

	if cloudConvertAPI := os.Getenv("CLOUDCONVERT_API"); cloudConvertAPI != "" {
		conf.CloudConvert.APIUrl = cloudConvertAPI
	}

	if cloudConvertKey := os.Getenv("CLOUDCONVERT_KEY"); cloudConvertKey != "" {
		conf.CloudConvert.APIKey = cloudConvertKey
	}

	if statsdAddress := os.Getenv("STATSD_ADDRESS"); statsdAddress != "" {
		conf.Statsd.Address = statsdAddress
	}

	if statsdPrefix := os.Getenv("STATSD_PREFIX"); statsdPrefix != "" {
		conf.Statsd.Prefix = statsdPrefix
	}

	if sentryDSN := os.Getenv("SENTRY_DSN"); sentryDSN != "" {
		conf.SentryDSN = sentryDSN
	}

	return conf
}