package worldconfig import ( "bufio" "fmt" "os" "strconv" "strings" ) const ( BACKEND_SQLITE3 string = "sqlite3" BACKEND_FILES string = "files" BACKEND_POSTGRES string = "postgresql" ) const ( CONFIG_BACKEND string = "backend" CONFIG_PLAYER_BACKEND string = "player_backend" CONFIG_PSQL_CONNECTION string = "pgsql_connection" CONFIG_PSQL_PLAYER_CONNECTION string = "pgsql_player_connection" CONFIG_PSQL_MAPSERVER string = "pgsql_mapserver_connection" ) type PsqlConfig struct { Host string Port int Username string Password string DbName string } type WorldConfig struct { Backend string PlayerBackend string PsqlConnection *PsqlConfig PsqlPlayerConnection *PsqlConfig MapObjectConnection *PsqlConfig } func parseConnectionString(str string) *PsqlConfig { cfg := PsqlConfig{} pairs := strings.Split(str, " ") for _, pair := range pairs { fmt.Println(pair) kv := strings.Split(pair, "=") switch kv[0] { case "host": cfg.Host = kv[1] case "port": cfg.Port, _ = strconv.Atoi(kv[1]) case "user": cfg.Host = kv[1] case "password": cfg.Password = kv[1] case "dbname": cfg.DbName = kv[1] } } return &cfg } func Parse(filename string) WorldConfig { file, err := os.Open(filename) if err != nil { panic(err) } defer file.Close() cfg := WorldConfig{} scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() sepIndex := strings.Index(line, "=") if sepIndex < 0 { continue } valueStr := strings.Trim(line[sepIndex+1:], " ") keyStr := strings.Trim(line[:sepIndex], " ") switch keyStr { case CONFIG_BACKEND: cfg.Backend = valueStr case CONFIG_PLAYER_BACKEND: cfg.PlayerBackend = valueStr case CONFIG_PSQL_CONNECTION: cfg.PsqlConnection = parseConnectionString(valueStr) case CONFIG_PSQL_PLAYER_CONNECTION: cfg.PsqlPlayerConnection = parseConnectionString(valueStr) case CONFIG_PSQL_MAPSERVER: cfg.MapObjectConnection = parseConnectionString(valueStr) } } return cfg }