Initial commit with config file parsing

This commit is contained in:
2022-04-12 22:47:03 -06:00
commit ecff43400c
4 changed files with 133 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work
+5
View File
@@ -0,0 +1,5 @@
module github.com/restitux/ikinuki-server
go 1.18
require github.com/pelletier/go-toml/v2 v2.0.0-beta.8
+12
View File
@@ -0,0 +1,12 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0=
github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+95
View File
@@ -0,0 +1,95 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
toml "github.com/pelletier/go-toml/v2"
)
type Config struct {
Address string
Port int
//Age int
//Cats []string
//Pi float64
//Perfection []int
//DOB time.Time // requires `import time`
}
func get_config() (Config, error) {
config := Config{
Address: "127.0.0.1",
Port: 32520,
}
// Find config path
// Linux (XDG base directory specification compliant)
xdg_config_home := os.Getenv("XDG_CONFIG_HOME")
var config_dir string
if xdg_config_home != "" {
config_dir = filepath.Join(xdg_config_home, "ikinuki")
} else {
home := os.Getenv("HOME")
config_dir = filepath.Join(home, ".config", "ikinuki")
}
err := os.MkdirAll(config_dir, 0755)
if err != nil {
return config, err
}
config_path := filepath.Join(config_dir, "server.toml")
fmt.Printf("Config File Dir: %v\n", config_path)
// open file, creating it if empty
config_file, err := os.OpenFile(config_path, os.O_RDWR | os.O_CREATE, 0755)
defer config_file.Close()
if err != nil {
return config, err
}
fi, err := config_file.Stat()
if err != nil {
return config, err
}
if fi.Size() == 0 {
// if file is empty, write default config
data, err := toml.Marshal(config)
if err != nil {
return config, err
}
config_file.Write(data)
return config, nil
} else {
// try to parse config file
data, err := ioutil.ReadAll(config_file)
if err != nil {
return config, err
}
err = toml.Unmarshal(data, &config)
if err != nil {
return config, err
}
return config, nil
}
}
func main() {
config, err := get_config()
if err != nil {
panic(err)
}
fmt.Printf("Config: %v\n", config)
}