package config import ( "fmt" "strings" "gopkg.in/ini.v1" ) type DataSourceConfig struct { Port int DBPath string } type RedisConfig struct { Host string Port int Password string } func loadRequiredInt(sec *ini.Section, key string) (int, error) { val, err := sec.GetKey(key) if err != nil { return 0, err } res, err := val.Int() if err != nil { return 0, err } return res, nil } func loadRequiredString(sec *ini.Section, key string) (string, error) { val, err := sec.GetKey(key) if err != nil { return "", err } res := strings.TrimSpace(val.String()) if res == "" { return "", fmt.Errorf("%s cannot be empty", key) } return res, nil } func LoadDataSourceConfig(cfg *ini.File) (*DataSourceConfig, error) { sec, err := cfg.GetSection("data_source") if err != nil { return nil, err } port, err := loadRequiredInt(sec, "port") if err != nil { return nil, err } dbPath, err := loadRequiredString(sec, "db_path") if err != nil { return nil, err } return &DataSourceConfig{ Port: port, DBPath: dbPath, }, nil } func LoadRedisConfig(cfg *ini.File) (*RedisConfig, error) { sec, err := cfg.GetSection("redis") if err != nil { return nil, err } host, err := loadRequiredString(sec, "host") if err != nil { return nil, err } port, err := loadRequiredInt(sec, "port") if err != nil { return nil, err } return &RedisConfig{ Host: host, Port: port, Password: strings.TrimSpace(sec.Key("password").String()), }, nil }