47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
type Config struct {
|
|
HTTPAddr string
|
|
MySQLDSN string
|
|
MaxOpen int
|
|
MaxIdle int
|
|
}
|
|
|
|
func Load() (Config, error) { return FromEnv(os.Getenv) }
|
|
func FromEnv(get func(string) string) (Config, error) {
|
|
c := Config{HTTPAddr: get("ORBIT_HTTP_ADDR"), MySQLDSN: get("ORBIT_MYSQL_DSN"), MaxOpen: 20, MaxIdle: 5}
|
|
if c.HTTPAddr == "" {
|
|
c.HTTPAddr = "127.0.0.1:8080"
|
|
}
|
|
if _, _, err := net.SplitHostPort(c.HTTPAddr); err != nil {
|
|
return Config{}, errors.New("invalid ORBIT_HTTP_ADDR")
|
|
}
|
|
if c.MySQLDSN == "" {
|
|
return Config{}, errors.New("ORBIT_MYSQL_DSN is required")
|
|
}
|
|
for _, field := range []struct {
|
|
name string
|
|
dst *int
|
|
}{{"ORBIT_DB_MAX_OPEN", &c.MaxOpen}, {"ORBIT_DB_MAX_IDLE", &c.MaxIdle}} {
|
|
if raw := get(field.name); raw != "" {
|
|
n, err := strconv.Atoi(raw)
|
|
if err != nil || n < 0 {
|
|
return Config{}, fmt.Errorf("%s must be a nonnegative integer", field.name)
|
|
}
|
|
*field.dst = n
|
|
}
|
|
}
|
|
if c.MaxOpen <= 0 || c.MaxIdle > c.MaxOpen {
|
|
return Config{}, errors.New("database pool requires 0 <= max_idle <= max_open and max_open > 0")
|
|
}
|
|
return c, nil
|
|
}
|