func (m *Manager) AllKeys() []string {
	keys := m.viper.AllKeys()
	sort.Strings(keys)
	return keys
}
AllKeys returns all keys holding a value, regardless of where they are set.
Nested keys are returned with a "." separator.
package config
import (
	"crypto/tls"
	"fmt"
	"io"
	"os"
	"reflect"
	"sort"
	"strings"
	"time"
	"github.com/mitchellh/mapstructure"
	"github.com/spf13/pflag"
	"github.com/spf13/viper"
	"go.thethings.network/lorawan-stack/v3/pkg/ttnpb"
	"go.thethings.network/lorawan-stack/v3/pkg/types"
)
const TimeFormat = time.RFC3339Nano
type Manager struct {
	name         string
	envPrefix    string
	viper        *viper.Viper
	flags        *pflag.FlagSet
	replacer     *strings.Replacer
	defaults     interface{}
	defaultPaths []string
	configFlag   string
	dataDirFlag  string
}
func (m *Manager) Flags() *pflag.FlagSet {
	return m.flags
}
func EnvKeyReplacer(r *strings.Replacer) Option {
	return func(m *Manager) {
		m.viper.SetEnvKeyReplacer(r)
		m.replacer = r
	}
}
func (m *Manager) AllEnvironment() []string {
	keys := m.AllKeys()
	env := make([]string, 0, len(keys))
	for _, key := range keys {
		env = append(env, m.EnvironmentForKey(key))
	}
	return env
}