Configuration file syntax and parsing for golang
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 lines
1.6 KiB

package forge
import (
"errors"
"fmt"
"math"
"strconv"
)
func asBoolean(value interface{}) (bool, error) {
switch val := value.(type) {
case bool:
return val, nil
case float64:
return val != 0, nil
case int64:
return val != 0, nil
case nil:
return false, nil
case string:
return val != "", nil
}
msg := fmt.Sprintf("Could not convert value %s to type BOOLEAN", value)
return false, errors.New(msg)
}
func asFloat(value interface{}) (float64, error) {
switch val := value.(type) {
case bool:
v := float64(0)
if val {
v = float64(1)
}
return v, nil
case float64:
return val, nil
case int64:
return float64(val), nil
case string:
return strconv.ParseFloat(val, 64)
}
msg := fmt.Sprintf("Could not convert value %s to type FLOAT", value)
return 0, errors.New(msg)
}
func asInteger(value interface{}) (int64, error) {
switch val := value.(type) {
case bool:
v := int64(0)
if val {
v = int64(1)
}
return v, nil
case float64:
return int64(math.Trunc(val)), nil
case int64:
return val, nil
case string:
return strconv.ParseInt(val, 10, 64)
}
msg := fmt.Sprintf("Could not convert value %s to type INTEGER", value)
return 0, errors.New(msg)
}
func asString(value interface{}) (string, error) {
switch val := value.(type) {
case bool:
s := "False"
if val {
s = "True"
}
return s, nil
case float64:
return strconv.FormatFloat(val, 10, -1, 64), nil
case int64:
return strconv.FormatInt(val, 10), nil
case nil:
return "Null", nil
case string:
return val, nil
}
msg := fmt.Sprintf("Could not convert value %s to type STRING", value)
return "", errors.New(msg)
}