|
|
package settings
import ( "encoding/json" "os" "path/filepath"
"github.com/spf13/afero" )
const ( Local FileSystemType = iota )
type FileSystemType int
type Settings struct { Endpoint string `json:"endpoint"` Authentication AuthenticationSettings `json:"authentication"` RateLimiter RateLimiterSettings `json:"rate_limiter"` StorageProvider StorageSettings `json:"storage_provider"` }
type StorageSettings struct { Type FileSystemType `json:"type"` BasePath string `json:"base_path"` }
type AuthenticationSettings struct { Enabled bool `json:"enabled"` Token string `json:"token"` }
type RateLimiterSettings struct { Enabled bool `json:"enabled"` RequestsPerMinute int `json:"requests_per_minute"` AllowedBurst int `json:"allowed_burst"` }
func parseSettings(data []byte) Settings { settings := Settings{}
err := json.Unmarshal(data, &settings) if err != nil { return Settings{} }
return settings }
func LoadSettings(fileSystem afero.Fs) (Settings, error) { workingDirectory, _ := os.Getwd() path := filepath.Join(workingDirectory, "settings.json")
// Load file and parse file
data, err := afero.ReadFile(fileSystem, path)
if err == nil { return parseSettings(data), nil }
// If file does not exist, create default settings
defaultSettings := Settings{ Endpoint: "127.0.0.1:8000", Authentication: AuthenticationSettings{ Enabled: true, Token: "changeme", }, RateLimiter: RateLimiterSettings{ Enabled: true, RequestsPerMinute: 20, AllowedBurst: 5, }, StorageProvider: StorageSettings{ Type: Local, BasePath: "assets", }, }
serializedSettings, err := json.MarshalIndent(defaultSettings, "", "\t") if err != nil { return Settings{}, err }
err = afero.WriteFile(fileSystem, path, serializedSettings, os.ModePerm) if err != nil { return Settings{}, err }
return defaultSettings, nil }
|