mapserver/worldconfig/parse.go
2019-01-04 16:30:18 +01:00

100 lines
1.8 KiB
Go

package worldconfig
import (
"fmt"
"bufio"
"os"
"strings"
"strconv"
)
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"
)
type PsqlConfig struct {
Host string
Port int
Username string
Password string
DbName string
}
type WorldConfig struct {
Backend string
PlayerBackend string
PsqlConnection *PsqlConfig
PsqlPlayerConnection *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)
lastPart := ""
for scanner.Scan() {
sc := bufio.NewScanner(strings.NewReader(scanner.Text()))
sc.Split(bufio.ScanWords)
for sc.Scan() {
switch (lastPart) {
case CONFIG_BACKEND:
cfg.Backend = sc.Text()
case CONFIG_PLAYER_BACKEND:
cfg.PlayerBackend = sc.Text()
case CONFIG_PSQL_CONNECTION:
cfg.PsqlConnection = parseConnectionString(sc.Text())
continue
case CONFIG_PSQL_PLAYER_CONNECTION:
cfg.PsqlPlayerConnection = parseConnectionString(sc.Text())
continue
}
if sc.Text() != "=" {
lastPart = sc.Text()
}
}
}
return cfg
}