diff --git a/config.go b/config.go index dd99385..ac7ee78 100644 --- a/config.go +++ b/config.go @@ -3,6 +3,8 @@ package gpaste import ( "fmt" "io" + "os" + "strings" "github.com/pelletier/go-toml" ) @@ -25,5 +27,29 @@ func ServerConfigFromReader(r io.Reader) (*ServerConfig, error) { return nil, fmt.Errorf("error decoding server config: %w", err) } + if c.Store == nil { + c.Store = &ServerStoreConfig{} + } + + c.updateFromEnv() + return &c, nil } + +func (sc *ServerConfig) updateFromEnv() { + if value, ok := os.LookupEnv("GPASTE_LOGLEVEL"); ok { + sc.LogLevel = strings.ToUpper(value) + } + + if value, ok := os.LookupEnv("GPASTE_URL"); ok { + sc.URL = value + } + + if value, ok := os.LookupEnv("GPASTE_LISTENADDR"); ok { + sc.ListenAddr = value + } + + if value, ok := os.LookupEnv("GPASTE_STORE_TYPE"); ok { + sc.Store.Type = value + } +} diff --git a/config_test.go b/config_test.go new file mode 100644 index 0000000..20968f7 --- /dev/null +++ b/config_test.go @@ -0,0 +1,84 @@ +package gpaste_test + +import ( + "os" + "strings" + "testing" + + "git.t-juice.club/torjus/gpaste" + "github.com/google/go-cmp/cmp" +) + +func TestServerConfig(t *testing.T) { + t.Run("FromReader", func(t *testing.T) { + clearEnv() + simpleConfig := ` +LogLevel = "INFO" +URL = "http://paste.example.org" +ListenAddr = ":8080" + +[Store] +Type = "memory" +` + expected := &gpaste.ServerConfig{ + LogLevel: "INFO", + URL: "http://paste.example.org", + ListenAddr: ":8080", + Store: &gpaste.ServerStoreConfig{ + Type: "memory", + }, + } + sr := strings.NewReader(simpleConfig) + + c, err := gpaste.ServerConfigFromReader(sr) + if err != nil { + t.Fatalf("Error parsing config: %s", err) + } + + if !cmp.Equal(c, expected) { + t.Errorf("Result does not match: %s", cmp.Diff(c, expected)) + } + }) + t.Run("FromEnv", func(t *testing.T) { + clearEnv() + + var envMap map[string]string = map[string]string{ + "GPASTE_LOGLEVEL": "DEBUG", + "GPASTE_URL": "http://gpaste.example.org", + "GPASTE_STORE_TYPE": "memory", + "GPASTE_LISTENADDR": ":8000", + } + expected := &gpaste.ServerConfig{ + LogLevel: "DEBUG", + URL: "http://gpaste.example.org", + ListenAddr: ":8000", + Store: &gpaste.ServerStoreConfig{ + Type: "memory", + }, + } + + for k, v := range envMap { + os.Setenv(k, v) + } + + sr := strings.NewReader("") + c, err := gpaste.ServerConfigFromReader(sr) + if err != nil { + t.Fatalf("Error parsing empty config") + } + + if !cmp.Equal(c, expected) { + t.Errorf("Result does not match: %s", cmp.Diff(c, expected)) + } + }) +} + +func clearEnv() { + for _, env := range os.Environ() { + result := strings.Split(env, "=") + value := result[0] + if strings.Contains(value, "GPASTE_") { + os.Unsetenv(value) + } + } +} diff --git a/go.mod b/go.mod index 8a91bea..6c30a0c 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require github.com/google/uuid v1.3.0 require github.com/go-chi/chi/v5 v5.0.7 require ( + github.com/google/go-cmp v0.5.6 github.com/pelletier/go-toml v1.9.4 github.com/urfave/cli/v2 v2.3.0 go.uber.org/zap v1.20.0 diff --git a/go.sum b/go.sum index cc1d5d4..04ac49e 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -65,6 +67,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=