package config import ( "errors" "log" "os" "github.com/alecthomas/kong" kongtoml "github.com/alecthomas/kong-toml" "github.com/pelletier/go-toml" ) type Config struct { Port string `toml:"port" default:"8080" comment:"The port to listen on for the server."` DatabaseFilePath string `toml:"database-file-path" default:"plm.db" comment:"Path to sqlite database file."` DemoDataPath string `toml:"demo-data-path" comment:"The path to the sql file to load for demo data."` JWTKey string `toml:"jwt-key" comment:"The key used to encrypt the generated JWT. Encoded in base64. If empty a random one will be generated on every restart."` ImageFolderPath string `toml:"image-folder-path" default:"img" comment:"Folder where uploaded files will be stored."` Limit int `toml:"limit" default:"100" comment:"A single API call will return at most this number of records."` InventaireUrl string `toml:"inventaire-url" default:"https://inventaire.io" comment:"An inventaire.io instance URL."` } func defaultConfig() Config { return Config{ Port: "8080", DatabaseFilePath: "plm.db", DemoDataPath: "", JWTKey: "", ImageFolderPath: "img", Limit: 100, InventaireUrl: "https://inventaire.io", } } func LoadConfig(configPath string) Config { f, err := os.ReadFile(configPath) if err != nil { if errors.Is(err, os.ErrNotExist) { return initConfig(configPath) } log.Fatal(err) } var cfg Config err = toml.Unmarshal(f, &cfg) if err != nil { panic(err) } kong.Parse(&cfg, kong.Configuration(kongtoml.Loader, configPath)) return cfg } func initConfig(configPath string) Config { cfg := defaultConfig() b, err := toml.Marshal(cfg) if err != nil { panic(err) } err = os.WriteFile(configPath, b, 0666) if err != nil { log.Fatal(err) } return cfg }