Add minimal config

This commit is contained in:
Torjus Håkestad 2023-12-05 00:45:43 +01:00
parent af0f583aff
commit e1e96e1e19
5 changed files with 122 additions and 0 deletions

1
go.mod
View File

@ -12,6 +12,7 @@ require (
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/uuid v1.4.0 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/pion/datachannel v1.5.5 // indirect
github.com/pion/dtls/v2 v2.2.8 // indirect
github.com/pion/ice/v3 v3.0.2 // indirect

2
go.sum
View File

@ -37,6 +37,8 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8=
github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=

9
ministream.toml Normal file
View File

@ -0,0 +1,9 @@
# SiteName is used for displaying title of site on frontend.
# Default: "ministream"
# Env: MINISTREAM_SITENAME
SiteName = "stream.example.org"
# HTTPListenAddr is which port the HTTP server will listen on.
# Default: ":8080"
# Env: MINISTREAM_HTTPLISTENADDR
HTTPListenAddr = ":8080"

73
server/config.go Normal file
View File

@ -0,0 +1,73 @@
package server
import (
"io"
"os"
"github.com/pelletier/go-toml/v2"
)
type Config struct {
SiteName string `json:"siteName" toml:"siteName"`
HTTPListenAddr string `json:"httpListenAddr" toml:"HTTPListenAddr"`
}
func DefaultConfig() *Config {
return &Config{
SiteName: "ministream",
HTTPListenAddr: ":8080",
}
}
func (c *Config) OverrideFromEnv() {
if siteName, ok := os.LookupEnv("MINISTREAM_SITENAME"); ok {
c.SiteName = siteName
}
if httpAddr, ok := os.LookupEnv("MINISTREAM_HTTPLISTENADDR"); ok {
c.HTTPListenAddr = httpAddr
}
}
func ConfigFromReader(r io.Reader) (*Config, error) {
var c Config
err := toml.NewDecoder(r).Decode(&c)
if err != nil {
return nil, err
}
return &c, nil
}
func ConfigFromFile(path string) (*Config, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
return ConfigFromReader(f)
}
func ConfigFromDefault() (*Config, error) {
var config *Config
defaultPaths := []string{
"ministream.toml",
}
for _, p := range defaultPaths {
c, err := ConfigFromFile(p)
if err != nil {
continue
}
config = c
break
}
if config == nil {
config = DefaultConfig()
}
return config, nil
}

37
server/config_test.go Normal file
View File

@ -0,0 +1,37 @@
package server_test
import (
"strings"
"testing"
"git.t-juice.club/torjus/ministream/server"
)
func TestConfig(t *testing.T) {
t.Run("FromReader", func(t *testing.T) {
configString := `SiteName = "ministream.example.org"`
expectedSiteName := "ministream.example.org"
r := strings.NewReader(configString)
c, err := server.ConfigFromReader(r)
if err != nil {
t.Fatalf("Error reading config: %s", err)
}
if c.SiteName != expectedSiteName {
t.Errorf("SiteName incorrect. Got %s want %s", c.SiteName, expectedSiteName)
}
})
t.Run("OverrideFromEnv", func(t *testing.T) {
c := server.DefaultConfig()
expectedSiteName := "ms.example.org"
t.Setenv("MINISTREAM_SITENAME", expectedSiteName)
c.OverrideFromEnv()
if c.SiteName != expectedSiteName {
t.Errorf("SiteName incorrect. Got %s want %s", c.SiteName, expectedSiteName)
}
})
}