// Load an extensible section that has a type keyword func LoadExtensibleSection(app *Application, sectionName string, extensions AvailableExtensions, env envconf.Environment, configFile ConfigFile) (obj HasConfigStruct, err error) { confSection := new(ExtensibleGlobals) conf, ok := configFile[sectionName] if !ok { return nil, fmt.Errorf("Missing section '%s'", sectionName) } if err = toml.PrimitiveDecode(conf, confSection); err != nil { return nil, err } if err = env.Decode(toEnvName(sectionName), EnvSep, confSection); err != nil { return nil, err } ext, ok := extensions.Get(confSection.Typ) if !ok { //TODO: Add log info to indicate using "default" return nil, fmt.Errorf("No type '%s' available to load for section '%s'", confSection.Typ, sectionName) } obj = ext() loadedConfig, err := LoadConfigStruct(sectionName, env, conf, obj) if err != nil { return nil, err } err = obj.Init(app, loadedConfig) return obj, err }
// Loads the config for a section supplied, configures the supplied object, and initializes func LoadConfigForSection(app *Application, sectionName string, obj HasConfigStruct, env envconf.Environment, configFile ConfigFile) (err error) { conf, ok := configFile[sectionName] if !ok { return fmt.Errorf("Error loading config file, section: %s", sectionName) } confStruct := obj.ConfigStruct() if confStruct == nil { return nil } if err = toml.PrimitiveDecode(conf, confStruct); err != nil { return fmt.Errorf("Unable to decode config for section '%s': %s", sectionName, err) } if err = env.Decode(toEnvName(sectionName), EnvSep, confStruct); err != nil { return fmt.Errorf("Invalid environment variable for section '%s': %s", sectionName, err) } err = obj.Init(app, confStruct) return }
func loadEnvConfig(env envconf.Environment, section string, app *Application, configable HasConfigStruct) (err error) { confStruct := configable.ConfigStruct() if err = env.Decode(toEnvName(section), EnvSep, confStruct); err != nil { return fmt.Errorf("Error decoding config for section %q: %s", section, err) } return configable.Init(app, confStruct) }
// Applies environment variable overrides to confStruct and initializes obj func LoadConfigFromEnvironment(app *Application, sectionName string, obj HasInit, env envconf.Environment, confStruct interface{}) (err error) { if confStruct == nil { return nil } if err = env.Decode(toEnvName(sectionName), EnvSep, confStruct); err != nil { return fmt.Errorf("Invalid environment variable for section '%s': %s", sectionName, err) } return obj.Init(app, confStruct) }
func LoadConfigStruct(sectionName string, env envconf.Environment, config toml.Primitive, configable HasConfigStruct) ( configStruct interface{}, err error) { if configStruct = configable.ConfigStruct(); configStruct == nil { return configStruct, nil } // Global section options // SimplePush defines some common parameters // that are defined in the ExtensibleGlobals struct. // Use reflection to extract the tagged ExtensibleGlobals fields. var pg ExtensibleGlobals rt := reflect.TypeOf(pg) ignoreConfig := make(map[string]interface{}, rt.NumField()) ignoreEnv := make(map[string]interface{}, rt.NumField()) for i := 0; i < rt.NumField(); i++ { sft := rt.Field(i) kname := sft.Tag.Get("toml") if len(kname) == 0 { kname = sft.Name } ignoreConfig[kname] = true if kname = sft.Tag.Get("env"); len(kname) == 0 { kname = sft.Name } ignoreEnv[toEnvName(sectionName, kname)] = true } if err = toml.PrimitiveDecodeStrict(config, configStruct, ignoreConfig); err != nil { matches := unknownOptionRegex.FindStringSubmatch(err.Error()) if len(matches) == 2 { // We've got an unrecognized config option. err = fmt.Errorf("Unknown config setting for section '%s': %s", sectionName, matches[1]) } return nil, err } if err = env.DecodeStrict(toEnvName(sectionName), EnvSep, configStruct, ignoreEnv); err != nil { return nil, fmt.Errorf("Invalid environment variable for section '%s': %s", sectionName, err) } return configStruct, nil }