func newColumnDefinition(column map[string]interface{}, order DataTableOrder) *ColumnDefinition { return &ColumnDefinition{ Name: column["data"].(string), Searchable: cast.ToBool(column["searchable"]), Orderable: cast.ToBool(column["orderable"]), Order: order, Search: newSearchDefinition(column["search"].(map[string]interface{})), } }
// Get returns an interface.. // Must be typecast or used by something that will typecast func (manager *Config) Get(key string) interface{} { jww.TRACE.Println("Looking for", key) v := manager.Find(key) if v == nil { return nil } jww.TRACE.Println("Found value", v) switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return v }
func (v *Viper) Get(key string) interface{} { key = strings.ToLower(key) val := v.find(key) if val == nil { return nil } switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
func (p *Page) getParam(key string, stringToLower bool) interface{} { v := p.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: if stringToLower { return strings.ToLower(cast.ToString(v)) } return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: if stringToLower { return helpers.SliceToLower(v.([]string)) } return v.([]string) case map[string]interface{}: // JSON and TOML return v case map[interface{}]interface{}: // YAML return v } jww.ERROR.Printf("GetParam(\"%s\"): Unknown type %s\n", key, reflect.TypeOf(v)) return nil }
func (v *Viper) Get(key string) interface{} { lcaseKey := strings.ToLower(key) val := v.find(lcaseKey) if val == nil { return nil } valType := val if v.typeByDefValue { // TODO(bep) this branch isn't covered by a single test. path := strings.Split(lcaseKey, v.keyDelim) defVal := v.searchMap(v.defaults, path) if defVal != nil { valType = defVal } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
func (c *Config) ShouldGzip(contentType string) bool { mediaType, _, _ := mime.ParseMediaType(contentType) if mediaType != "" { return cast.ToBool(c.gzipPatterns.get(mediaType)) } return false }
// Get can retrieve any value given the key to use // Get returns an interface. For a specific value use one of the Get____ methods. func (c RawConfig) Get(key string) interface{} { path := strings.Split(key, keyDelim) val := c.find(strings.ToLower(key)) if val == nil { source := c.find(path[0]) if source == nil { return nil } if reflect.TypeOf(source).Kind() == reflect.Map { val = c.searchMap(cast.ToStringMap(source), path[1:]) } } switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
func (v *Viper) Get(key string) interface{} { path := strings.Split(key, v.keyDelim) var val interface{} lcaseKey := strings.ToLower(key) source := v.find(path[0]) if source != nil { if reflect.TypeOf(source).Kind() == reflect.Map { val = v.searchMap(cast.ToStringMap(source), path[1:]) } } if val == nil { val = v.find(lcaseKey) } if val == nil { return nil } var valType interface{} if !v.typeByDefValue { valType = val } else { defVal, defExists := v.defaults[lcaseKey] if defExists { valType = defVal } else { valType = val } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
func (v *Viper) BindPFlag(key string, flag *pflag.Flag) (err error) { if flag == nil { return fmt.Errorf("flag for %q is nil", key) } v.pflags[strings.ToLower(key)] = flag switch flag.Value.Type() { case "int", "int8", "int16", "int32", "int64": SetDefault(key, cast.ToInt(flag.Value.String())) case "bool": SetDefault(key, cast.ToBool(flag.Value.String())) default: SetDefault(key, flag.Value.String()) } return nil }
func (suite *GitConfigTestSuite) TestCast() { assert := assert.New(suite.T()) hostsRaw := viper.Get("git.hosts") //fmt.Println(hostsRaw) hostsSlice := cast.ToSlice(hostsRaw) //fmt.Println(hostsSlice) for _, host := range hostsSlice { hostMap := cast.ToStringMap(host) name := cast.ToString(hostMap["name"]) https := cast.ToBool(hostMap["https"]) if name == "git.saber.io" { assert.Equal(false, https) } } }
// Modify user func PutUser(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { jr := jresp.NewJsonResp() if !authUser(r) { jr.Error("User not authorized for Change User") fmt.Fprint(w, jr.ToString(conf.Debug)) return } admin := getUser(r) if !admin.HasRole("admin") { jr.Error("User not allowed to Change User") fmt.Fprint(w, jr.ToString(conf.Debug)) return } // Verify two factor for change user if res, _ := admin.ValidateTotp(r.PostFormValue("token")); res == false { jr.Error("Invalid two factor token") fmt.Fprint(w, jr.ToString(conf.Debug)) return } // Username username := r.PostFormValue("username") user := server.userStore.ByName(username) if user == nil { jr.Error("Cannot find user to modify") fmt.Fprint(w, jr.ToString(conf.Debug)) return } for key, _ := range r.PostForm { switch key { case "enable": user.Enabled = cast.ToBool(r.PostFormValue(key)) case "username", "token": continue default: jr.Error("Invalid change request") fmt.Fprint(w, jr.ToString(conf.Debug)) return } } server.userStore.save() jr.Set("changed", true) jr.OK() fmt.Fprint(w, jr.ToString(conf.Debug)) }
// Binds a configuration key to a command line flag: // pflag.Int("port", 8080, "The best alternative port") // confer.BindPFlag("port", pflag.Lookup("port")) func (manager *Config) BindPFlag(key string, flag *pflag.Flag) (err error) { if flag == nil { return fmt.Errorf("flag for %q is nil", key) } manager.pflags.Set(key, flag) switch flag.Value.Type() { case "int", "int8", "int16", "int32", "int64": manager.SetDefault(key, cast.ToInt(flag.Value.String())) case "bool": manager.SetDefault(key, cast.ToBool(flag.Value.String())) default: manager.SetDefault(key, flag.Value.String()) } return nil }
func (c *Config) loadGzip(seq sequence) error { c.gzipPatterns = newGlobList(false) el, ok := seq.elForKey("gzip") if !ok { return nil } if cast.ToBool(el.value) { // el.value == `true`, load defaults return c.loadGzipValues(defaultCompressableMimeTypes) } else if list := el.stringSliceForSeqValues(); len(list) > 0 { // el.value == string sequence return c.loadGzipValues(list) } else if len(el.value) > 0 { // el.value == string return c.loadGzipValues([]string{el.value}) } return nil }
func (v *Viper) BindPFlags(flags *pflag.FlagSet) (err error) { flags.VisitAll(func(flag *pflag.Flag) { if err != nil { // an error has been encountered in one of the previous flags return } err = v.BindPFlag(flag.Name, flag) switch flag.Value.Type() { case "int", "int8", "int16", "int32", "int64": v.SetDefault(flag.Name, cast.ToInt(flag.Value.String())) case "bool": v.SetDefault(flag.Name, cast.ToBool(flag.Value.String())) default: v.SetDefault(flag.Name, flag.Value.String()) } }) return }
//get Config value by key func (c *Config) Get(key string) interface{} { val := c.get(key) switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
// ReadConfigFile read user defined hosts in .ayi.yml func ReadConfigFile() { log.Debug("Read git section in config file") hostsMap = make(map[string]Host) hostsSlice := cast.ToSlice(viper.Get("git.hosts")) for _, h := range hostsSlice { m := cast.ToStringMap(h) _, exists := m["name"] if !exists { log.Warn("Skipp host without name") continue } // TODO: more attributes, the following is not working // - http port // - support ssh name := cast.ToString(m["name"]) https := cast.ToBool(util.GetWithDefault(m, "https", true)) port := cast.ToInt(util.GetWithDefault(m, "port", DefaultSSHPort)) h := NewHost(name) h.SupportHTTPS = https h.SSHPort = port hosts = append(hosts, *h) // TODO: may add order to host hostsMap[name] = *h } // only merge default hosts that are not configed in config files for _, defaultHost := range DefaultHosts { _, exists := hostsMap[defaultHost.URL] if !exists { hosts = append(hosts, defaultHost) hostsMap[defaultHost.URL] = defaultHost } } }
func (page *Page) GetParam(key string) interface{} { v := page.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return strings.ToLower(cast.ToString(v)) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return sliceToLower(v.([]string)) } return nil }
func (s *SiteInfo) GetParam(key string) interface{} { v := s.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return nil }
// Get returns an interface.. // Must be typecast or used by something that will typecast func Get(key string) interface{} { key = strings.ToLower(key) v := find(key) if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return v }
// Give me a struct with field tags and i'll validate you, set defaults, etc. func (cl *ConfigLoader) Validate(iface interface{}) error { iValue := reflect.ValueOf(iface).Elem().Interface() st := reflect.TypeOf(iValue) ps := reflect.ValueOf(iValue) // Loop all fields, set their default values if they have them and are empty // Fail if mandatory fields are not set and have no value for i := 0; i < ps.NumField(); i++ { f := st.Field(i) field := ps.FieldByName(f.Name) dataKind := field.Kind() var fValue interface{} // Is an exported field, needs to // start with an uppercase letter fValue = getFieldValue(f.Name, field) if !isExportedField(f.Name) { continue } // Fail fast: bad regex on field // Validate regex regexStr := f.Tag.Get("regex") var regex *regexp.Regexp var err error if regexStr != "" && dataKind != reflect.String { return errors.New(fmt.Sprintf("Field '%s' has invalid 'regex' Tag '%s'. Regex can only be applied to string types", f.Name, regexStr)) } else if regexStr != "" { regex, err = regexp.Compile(regexStr) if err != nil { return errors.New(fmt.Sprintf("Field '%s' has invalid regex '%s': %s", f.Name, regexStr, err.Error())) } } required := cast.ToBool(f.Tag.Get("required")) == true defaultVal := f.Tag.Get("default") if (required == true || defaultVal != "") && isZero(field) { if required == true && defaultVal == "" && isZero(field) { return errors.New(fmt.Sprintf("Mandatory field '%s' has not been set, and has no provided default", f.Name)) } field = reflect.ValueOf(iface).Elem().FieldByName(f.Name) switch dataKind { case reflect.Bool: field.SetBool(cast.ToBool(defaultVal)) case reflect.String: field.SetString(defaultVal) case reflect.Slice, reflect.Array: _type := field.Type().Elem() _newArr := strings.Split(f.Tag.Get("default"), ",") switch _type { case reflect.TypeOf(""): field.Set(reflect.ValueOf(_newArr)) case reflect.TypeOf(1): // Convert array to int intArray := make([]int, len(_newArr)) var err error for j, val := range _newArr { intArray[j], err = strconv.Atoi(val) if err != nil { return errors.New(fmt.Sprintf("Error creating default array for field '$s': %v\n", f.Name, err)) } } field.Set(reflect.ValueOf(intArray)) default: return errors.New(fmt.Sprintf("Unsupported slice default type: %v\n", _type)) } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: s, err := strconv.ParseInt(defaultVal, 10, 64) if err != nil { return err } field.SetInt(s) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: s, err := strconv.ParseUint(defaultVal, 10, 64) if err != nil { return err } field.SetUint(s) default: return errors.New(fmt.Sprintf("Unsupported field '%s' of type: %s", f.Name, dataKind)) } } else { if regex != nil { if !regex.MatchString(fValue.(string)) { return errors.New(fmt.Sprintf("Regex validation failed on field '%s'. /%s/ does not match '%s'", f.Name, regexStr, fValue.(string))) } } } } return nil }
// Given a key, find the value. // Viper will check in the following order: // flag, env, config file, key/value store, default. // Viper will check to see if an alias exists first. // Note: this assumes a lower-cased key given. func (v *Viper) find(lcaseKey string) interface{} { var ( val interface{} exists bool path = strings.Split(lcaseKey, v.keyDelim) nested = len(path) > 1 ) // compute the path through the nested maps to the nested value if nested && v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)) != "" { return nil } // if the requested key is an alias, then return the proper key lcaseKey = v.realKey(lcaseKey) path = strings.Split(lcaseKey, v.keyDelim) nested = len(path) > 1 // Set() override first val = v.searchMap(v.override, path) if val != nil { return val } if nested && v.isPathShadowedInDeepMap(path, v.override) != "" { return nil } // PFlag override next flag, exists := v.pflags[lcaseKey] if exists && flag.HasChanged() { switch flag.ValueType() { case "int", "int8", "int16", "int32", "int64": return cast.ToInt(flag.ValueString()) case "bool": return cast.ToBool(flag.ValueString()) case "stringSlice": s := strings.TrimPrefix(flag.ValueString(), "[") return strings.TrimSuffix(s, "]") default: return flag.ValueString() } } if nested && v.isPathShadowedInFlatMap(path, v.pflags) != "" { return nil } // Env override next if v.automaticEnvApplied { // even if it hasn't been registered, if automaticEnv is used, // check any Get request if val = v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); val != "" { return val } if nested && v.isPathShadowedInAutoEnv(path) != "" { return nil } } envkey, exists := v.env[lcaseKey] if exists { if val = v.getEnv(envkey); val != "" { return val } } if nested && v.isPathShadowedInFlatMap(path, v.env) != "" { return nil } // Config file next val = v.searchMapWithPathPrefixes(v.config, path) if val != nil { return val } if nested && v.isPathShadowedInDeepMap(path, v.config) != "" { return nil } // K/V store next val = v.searchMap(v.kvstore, path) if val != nil { return val } if nested && v.isPathShadowedInDeepMap(path, v.kvstore) != "" { return nil } // Default next val = v.searchMap(v.defaults, path) if val != nil { return val } if nested && v.isPathShadowedInDeepMap(path, v.defaults) != "" { return nil } // last chance: if no other value is returned and a flag does exist for the value, // get the flag's value even if the flag's value has not changed if flag, exists := v.pflags[lcaseKey]; exists { switch flag.ValueType() { case "int", "int8", "int16", "int32", "int64": return cast.ToInt(flag.ValueString()) case "bool": return cast.ToBool(flag.ValueString()) case "stringSlice": s := strings.TrimPrefix(flag.ValueString(), "[") return strings.TrimSuffix(s, "]") default: return flag.ValueString() } } // last item, no need to check shadowing return nil }
func (p *Page) update(f interface{}) error { if f == nil { return fmt.Errorf("no metadata found") } m := f.(map[string]interface{}) var err error var draft, published, isCJKLanguage *bool for k, v := range m { loki := strings.ToLower(k) switch loki { case "title": p.Title = cast.ToString(v) case "linktitle": p.linkTitle = cast.ToString(v) case "description": p.Description = cast.ToString(v) case "slug": p.Slug = cast.ToString(v) case "url": if url := cast.ToString(v); strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { return fmt.Errorf("Only relative URLs are supported, %v provided", url) } p.URL = cast.ToString(v) case "type": p.contentType = cast.ToString(v) case "extension", "ext": p.extension = cast.ToString(v) case "keywords": p.Keywords = cast.ToStringSlice(v) case "date": p.Date, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse date '%v' in page %s", v, p.File.Path()) } case "lastmod": p.Lastmod, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse lastmod '%v' in page %s", v, p.File.Path()) } case "publishdate", "pubdate": p.PublishDate, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse publishdate '%v' in page %s", v, p.File.Path()) } case "draft": draft = new(bool) *draft = cast.ToBool(v) case "published": // Intentionally undocumented published = new(bool) *published = cast.ToBool(v) case "layout": p.Layout = cast.ToString(v) case "markup": p.Markup = cast.ToString(v) case "weight": p.Weight = cast.ToInt(v) case "aliases": p.Aliases = cast.ToStringSlice(v) for _, alias := range p.Aliases { if strings.HasPrefix(alias, "http://") || strings.HasPrefix(alias, "https://") { return fmt.Errorf("Only relative aliases are supported, %v provided", alias) } } case "status": p.Status = cast.ToString(v) case "sitemap": p.Sitemap = parseSitemap(cast.ToStringMap(v)) case "iscjklanguage": isCJKLanguage = new(bool) *isCJKLanguage = cast.ToBool(v) default: // If not one of the explicit values, store in Params switch vv := v.(type) { case bool: p.Params[loki] = vv case string: p.Params[loki] = vv case int64, int32, int16, int8, int: p.Params[loki] = vv case float64, float32: p.Params[loki] = vv case time.Time: p.Params[loki] = vv default: // handle array of strings as well switch vvv := vv.(type) { case []interface{}: if len(vvv) > 0 { switch vvv[0].(type) { case map[interface{}]interface{}: // Proper parsing structured array from YAML based FrontMatter p.Params[loki] = vvv case map[string]interface{}: // Proper parsing structured array from JSON based FrontMatter p.Params[loki] = vvv default: a := make([]string, len(vvv)) for i, u := range vvv { a[i] = cast.ToString(u) } p.Params[loki] = a } } else { p.Params[loki] = []string{} } default: p.Params[loki] = vv } } } } if draft != nil && published != nil { p.Draft = *draft jww.ERROR.Printf("page %s has both draft and published settings in its frontmatter. Using draft.", p.File.Path()) return ErrHasDraftAndPublished } else if draft != nil { p.Draft = *draft } else if published != nil { p.Draft = !*published } if p.Lastmod.IsZero() { p.Lastmod = p.Date } if isCJKLanguage != nil { p.isCJKLanguage = *isCJKLanguage } else if viper.GetBool("HasCJKLanguage") { if cjk.Match(p.rawContent) { p.isCJKLanguage = true } else { p.isCJKLanguage = false } } return nil }
func (p *Page) update(f interface{}) error { if f == nil { return fmt.Errorf("no metadata found") } m := f.(map[string]interface{}) var err error for k, v := range m { loki := strings.ToLower(k) switch loki { case "title": p.Title = cast.ToString(v) case "linktitle": p.linkTitle = cast.ToString(v) case "description": p.Description = cast.ToString(v) case "slug": p.Slug = cast.ToString(v) case "url": if url := cast.ToString(v); strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { return fmt.Errorf("Only relative URLs are supported, %v provided", url) } p.URL = cast.ToString(v) case "type": p.contentType = cast.ToString(v) case "extension", "ext": p.extension = cast.ToString(v) case "keywords": p.Keywords = cast.ToStringSlice(v) case "date": p.Date, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse date '%v' in page %s", v, p.File.Path()) } case "lastmod": p.Lastmod, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse lastmod '%v' in page %s", v, p.File.Path()) } case "publishdate", "pubdate": p.PublishDate, err = cast.ToTimeE(v) if err != nil { jww.ERROR.Printf("Failed to parse publishdate '%v' in page %s", v, p.File.Path()) } case "draft": p.Draft = cast.ToBool(v) case "layout": p.layout = cast.ToString(v) case "markup": p.Markup = cast.ToString(v) case "weight": p.Weight = cast.ToInt(v) case "aliases": p.Aliases = cast.ToStringSlice(v) for _, alias := range p.Aliases { if strings.HasPrefix(alias, "http://") || strings.HasPrefix(alias, "https://") { return fmt.Errorf("Only relative aliases are supported, %v provided", alias) } } case "status": p.Status = cast.ToString(v) case "sitemap": p.Sitemap = parseSitemap(cast.ToStringMap(v)) default: // If not one of the explicit values, store in Params switch vv := v.(type) { case bool: p.Params[loki] = vv case string: p.Params[loki] = vv case int64, int32, int16, int8, int: p.Params[loki] = vv case float64, float32: p.Params[loki] = vv case time.Time: p.Params[loki] = vv default: // handle array of strings as well switch vvv := vv.(type) { case []interface{}: var a = make([]string, len(vvv)) for i, u := range vvv { a[i] = cast.ToString(u) } p.Params[loki] = a default: p.Params[loki] = vv } } } } if p.Lastmod.IsZero() { p.Lastmod = p.Date } return nil }
func (v *Viper) GetBool(key string) bool { return cast.ToBool(v.Get(key)) }
func (v *Viper) Get(key string) interface{} { path := strings.Split(key, v.keyDelim) lcaseKey := strings.ToLower(key) val := v.find(lcaseKey) if val == nil { source := v.find(strings.ToLower(path[0])) if source != nil { if reflect.TypeOf(source).Kind() == reflect.Map { val = v.searchMap(cast.ToStringMap(source), path[1:]) } } } // if no other value is returned and a flag does exist for the value, // get the flag's value even if the flag's value has not changed if val == nil { if flag, exists := v.pflags[lcaseKey]; exists { jww.TRACE.Println(key, "get pflag default", val) switch flag.ValueType() { case "int", "int8", "int16", "int32", "int64": val = cast.ToInt(flag.ValueString()) case "bool": val = cast.ToBool(flag.ValueString()) default: val = flag.ValueString() } } } if val == nil { return nil } var valType interface{} if !v.typeByDefValue { valType = val } else { defVal, defExists := v.defaults[lcaseKey] if defExists { valType = defVal } else { valType = val } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
func (page *Page) update(f interface{}) error { if f == nil { return fmt.Errorf("no metadata found") } m := f.(map[string]interface{}) for k, v := range m { loki := strings.ToLower(k) switch loki { case "title": page.Title = cast.ToString(v) case "linktitle": page.linkTitle = cast.ToString(v) case "description": page.Description = cast.ToString(v) case "slug": page.Slug = helpers.Urlize(cast.ToString(v)) case "url": if url := cast.ToString(v); strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { return fmt.Errorf("Only relative urls are supported, %v provided", url) } page.Url = helpers.Urlize(cast.ToString(v)) case "type": page.contentType = cast.ToString(v) case "keywords": page.Keywords = cast.ToStringSlice(v) case "date", "pubdate": page.Date = cast.ToTime(v) case "draft": page.Draft = cast.ToBool(v) case "layout": page.layout = cast.ToString(v) case "markup": page.Markup = cast.ToString(v) case "weight": page.Weight = cast.ToInt(v) case "aliases": page.Aliases = cast.ToStringSlice(v) for _, alias := range page.Aliases { if strings.HasPrefix(alias, "http://") || strings.HasPrefix(alias, "https://") { return fmt.Errorf("Only relative aliases are supported, %v provided", alias) } } case "status": page.Status = cast.ToString(v) case "sitemap": page.Sitemap = parseSitemap(cast.ToStringMap(v)) default: // If not one of the explicit values, store in Params switch vv := v.(type) { case bool: page.Params[loki] = vv case string: page.Params[loki] = vv case int64, int32, int16, int8, int: page.Params[loki] = vv case float64, float32: page.Params[loki] = vv case time.Time: page.Params[loki] = vv default: // handle array of strings as well switch vvv := vv.(type) { case []interface{}: var a = make([]string, len(vvv)) for i, u := range vvv { a[i] = cast.ToString(u) } page.Params[loki] = a default: page.Params[loki] = vv } } } } return nil }
func GetBool(key string) bool { return cast.ToBool(Get(key)) }
// Given a key, find the value // Viper will check in the following order: // flag, env, config file, key/value store, default // Viper will check to see if an alias exists first func (v *Viper) find(key string) interface{} { var val interface{} var exists bool // if the requested key is an alias, then return the proper key key = v.realKey(key) // PFlag Override first flag, exists := v.pflags[key] if exists && flag.HasChanged() { jww.TRACE.Println(key, "found in override (via pflag):", flag.ValueString()) switch flag.ValueType() { case "int", "int8", "int16", "int32", "int64": return cast.ToInt(flag.ValueString()) case "bool": return cast.ToBool(flag.ValueString()) default: return flag.ValueString() } } val, exists = v.override[key] if exists { jww.TRACE.Println(key, "found in override:", val) return val } if v.automaticEnvApplied { // even if it hasn't been registered, if automaticEnv is used, // check any Get request if val = v.getEnv(v.mergeWithEnvPrefix(key)); val != "" { jww.TRACE.Println(key, "found in environment with val:", val) return val } } envkey, exists := v.env[key] if exists { jww.TRACE.Println(key, "registered as env var", envkey) if val = v.getEnv(envkey); val != "" { jww.TRACE.Println(envkey, "found in environment with val:", val) return val } else { jww.TRACE.Println(envkey, "env value unset:") } } val, exists = v.config[key] if exists { jww.TRACE.Println(key, "found in config:", val) return val } // Test for nested config parameter if strings.Contains(key, v.keyDelim) { path := strings.Split(key, v.keyDelim) source := v.find(path[0]) if source != nil { if reflect.TypeOf(source).Kind() == reflect.Map { val := v.searchMap(cast.ToStringMap(source), path[1:]) jww.TRACE.Println(key, "found in nested config:", val) return val } } } val, exists = v.kvstore[key] if exists { jww.TRACE.Println(key, "found in key/value store:", val) return val } val, exists = v.defaults[key] if exists { jww.TRACE.Println(key, "found in defaults:", val) return val } return nil }
func (manager *Config) GetBool(key string) bool { return cast.ToBool(manager.Get(key)) }
func (c *Config) GetBool(key string) bool { return cast.ToBool(c.get(key)) }