commit ecff43400caa4be59a97856b521c159b9c07e45a Author: restitux Date: Tue Apr 12 22:47:03 2022 -0600 Initial commit with config file parsing diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b735ec --- /dev/null +++ b/.gitignore @@ -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 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a5f4ab9 --- /dev/null +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..6ee4343 --- /dev/null +++ b/go.sum @@ -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= diff --git a/main.go b/main.go new file mode 100644 index 0000000..64d1a10 --- /dev/null +++ b/main.go @@ -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) + + +}