code: func (cfg *Config) checkMissingAndDepreciated() error {
  	cfgElem := reflect.ValueOf(cfg).Elem()
  	cfgStructField := reflect.Indirect(reflect.ValueOf(cfg)).Type()
  
  	fatalFields := []string{}
  	for i := 0; i < cfgElem.NumField(); i++ {
  		cfgField := cfgElem.Field(i)
  		if utils.ZeroOrNil(cfgField.Interface()) {
  			missingTag := cfgStructField.Field(i).Tag.Get("missing")
  			if len(missingTag) == 0 {
  				continue
  			}
  			switch missingTag {
  			case "warn":
  				seelog.Warnf("Configuration key not set, key: %v", cfgStructField.Field(i).Name)
  			case "fatal":
  				seelog.Criticalf("Configuration key not set, key: %v", cfgStructField.Field(i).Name)
  				fatalFields = append(fatalFields, cfgStructField.Field(i).Name)
  			default:
  				seelog.Warnf("Unexpected `missing` tag value, tag %v", missingTag)
  			}
  		} else {
  			// present
  			deprecatedTag := cfgStructField.Field(i).Tag.Get("deprecated")
  			if len(deprecatedTag) == 0 {
  				continue
  			}
  			seelog.Warnf("Use of deprecated configuration key, key: %v message: %v", cfgStructField.Field(i).Name, deprecatedTag)
  		}
  	}
  	if len(fatalFields) > 0 {
  		return errors.New("Missing required fields: " + strings.Join(fatalFields, ", "))
  	}
  	return nil
  }
docs: // checkMissingAndDeprecated checks all zero-valued fields for tags of the form
  // missing:STRING and acts based on that string. Current options are: fatal,
  // warn. Fatal will result in an error being returned, warn will result in a
  // warning that the field is missing being logged.