diff --git a/api.go b/api.go index 161586651bf913dfce341814cab84a8a8256b23c..86cdfb132fd0e025de5cd2b630184e47f1abc605 100644 --- a/api.go +++ b/api.go @@ -4,9 +4,9 @@ import "github.com/imdario/mergo" // NewSetting creates a new configuration setting // with the given defaults. -func New[C any](defaults C) *setting[C] { +func New[C any](defaults C) *Settings[C] { - s := &setting[C]{} + s := &Settings[C]{} s.initDefaults() if err := mergo.Merge(&defaults, s.config); err != nil { @@ -28,7 +28,7 @@ func New[C any](defaults C) *setting[C] { // Set the mnemonic // The mnemonic is used to identify the configuration in the configuration file -func (s *setting[C]) SetMnemonic(mnemonic string) *setting[C] { +func (s *Settings[C]) SetMnemonic(mnemonic string) *Settings[C] { if mnemonic == "" { s.errors = append(s.errors, MnemonicEmptyError) } else { @@ -38,6 +38,6 @@ func (s *setting[C]) SetMnemonic(mnemonic string) *setting[C] { } // Config() returns the configuration -func (s *setting[C]) Config() C { +func (s *Settings[C]) Config() C { return s.config } diff --git a/change.go b/change.go index c7dd5da374173bbd78ae05197a0bf39a9e204e2e..d68aad6e6ffde8bd41dab5b8b213717ec873202c 100644 --- a/change.go +++ b/change.go @@ -10,19 +10,19 @@ type ChangeEvent struct { type EventHook func(event ChangeEvent) -func (s *setting[C]) OnChange(hook EventHook) *setting[C] { +func (s *Settings[C]) OnChange(hook EventHook) *Settings[C] { s.hooks.change = append(s.hooks.change, hook) return s } -func (s *setting[C]) notifyChangeHooks(changelog diff.Changelog) *setting[C] { +func (s *Settings[C]) notifyChangeHooks(changelog diff.Changelog) *Settings[C] { for _, h := range s.hooks.change { h(ChangeEvent{Changlog: changelog}) } return s } -func (s *setting[C]) setConfigInternal(config C, lock bool) *setting[C] { +func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] { var ( changelog diff.Changelog @@ -68,6 +68,6 @@ func (s *setting[C]) setConfigInternal(config C, lock bool) *setting[C] { return s } -func (s *setting[C]) SetConfig(config C) *setting[C] { +func (s *Settings[C]) SetConfig(config C) *Settings[C] { return s.setConfigInternal(config, true) } diff --git a/env.go b/env.go index b656b66be6cc19eaf637d1d5d309b2efb44514cd..871e4fe05a4d61784c84cc4f4816a06838d7bdd7 100644 --- a/env.go +++ b/env.go @@ -6,7 +6,7 @@ import ( "strconv" ) -func (s *setting[C]) InitFromEnv(prefix string) *setting[C] { +func (s *Settings[C]) InitFromEnv(prefix string) *Settings[C] { s.Lock() defer s.Unlock() diff --git a/error.go b/error.go index 667c886070b46ed431dfd3b052eb1a262587fb6e..0addae37b10d3ed7658d4b08a8a7c90392def8d2 100644 --- a/error.go +++ b/error.go @@ -7,18 +7,18 @@ import ( // ResetError is used to reset the error to nil // After calling this function, the call HasErrors() will return false -func (s *setting[C]) ResetErrors() *setting[C] { +func (s *Settings[C]) ResetErrors() *Settings[C] { s.errors = []error{} return s } // Check if the setting contains errors -func (s *setting[C]) HasErrors() bool { +func (s *Settings[C]) HasErrors() bool { return len(s.errors) > 0 } // Get all errors -func (s *setting[C]) Errors() []error { +func (s *Settings[C]) Errors() []error { return s.errors } diff --git a/export.go b/export.go index c62cf595dc61309897a8027816d88b1a1c4e2053..269817ba2eb6a1acf35d211e6619cb3194c78b79 100644 --- a/export.go +++ b/export.go @@ -10,24 +10,24 @@ import ( "gopkg.in/yaml.v3" ) -func (s *setting[C]) Export() *setting[C] { +func (s *Settings[C]) Export() *Settings[C] { return s } -func (s *setting[C]) writeJson(writer io.Writer) error { +func (s *Settings[C]) writeJson(writer io.Writer) error { encoder := json.NewEncoder(writer) return encoder.Encode(s.config) } -func (s *setting[C]) writeYaml(writer io.Writer) error { +func (s *Settings[C]) writeYaml(writer io.Writer) error { encoder := yaml.NewEncoder(writer) return encoder.Encode(s.config) } -func (s *setting[C]) writeToml(writer io.Writer) error { +func (s *Settings[C]) writeToml(writer io.Writer) error { encoder := toml.NewEncoder(writer) return encoder.Encode(s.config) } -func (s *setting[C]) writeProperties(writer io.Writer) error { +func (s *Settings[C]) writeProperties(writer io.Writer) error { m, errors := getMapForProperties[C](s.config) @@ -44,7 +44,7 @@ func (s *setting[C]) writeProperties(writer io.Writer) error { } -func (s *setting[C]) WriteFile(fn string, format Format) *setting[C] { +func (s *Settings[C]) WriteFile(fn string, format Format) *Settings[C] { var err error @@ -66,7 +66,7 @@ func (s *setting[C]) WriteFile(fn string, format Format) *setting[C] { } -func (s *setting[C]) Write(writer io.Writer, format Format) *setting[C] { +func (s *Settings[C]) Write(writer io.Writer, format Format) *Settings[C] { var err error diff --git a/file.go b/file.go index 2a1dd26749bb5812192ac76faf8c745be97f5bf1..8685fd2d7682028837862cc11c4d25f71de21514 100644 --- a/file.go +++ b/file.go @@ -21,7 +21,7 @@ type fileBackend struct { } // AddFiles adds a file to the list of files to import -func (s *setting[C]) AddFile(file string, format Format) *setting[C] { +func (s *Settings[C]) AddFile(file string, format Format) *Settings[C] { s.files.files = append(s.files.files, files{file, format}) return s } @@ -33,12 +33,12 @@ func initFileBackend(files *fileBackend) { } // Path returns the configuration directory -func (s *setting[C]) Directories() []string { +func (s *Settings[C]) Directories() []string { return s.files.directories } // AddPath adds a directory to the configuration directory -func (s *setting[C]) AddDirectory(d string) *setting[C] { +func (s *Settings[C]) AddDirectory(d string) *Settings[C] { s.Lock() defer s.Unlock() s.files.directories = append(s.files.directories, d) @@ -46,7 +46,7 @@ func (s *setting[C]) AddDirectory(d string) *setting[C] { return s } -func (s *setting[C]) sanitizeDirectories() { +func (s *Settings[C]) sanitizeDirectories() { wd, err := os.Getwd() if err != nil { @@ -76,7 +76,7 @@ func (s *setting[C]) sanitizeDirectories() { } // Set all configuration directories -func (s *setting[C]) SetDirectories(d []string) *setting[C] { +func (s *Settings[C]) SetDirectories(d []string) *Settings[C] { s.Lock() defer s.Unlock() @@ -86,7 +86,7 @@ func (s *setting[C]) SetDirectories(d []string) *setting[C] { } // Add the current working directory to the configuration directory -func (s *setting[C]) AddWorkingDirectory() *setting[C] { +func (s *Settings[C]) AddWorkingDirectory() *Settings[C] { s.Lock() defer s.Unlock() @@ -101,7 +101,7 @@ func (s *setting[C]) AddWorkingDirectory() *setting[C] { } // Add the Unix etc directory to the configuration directory -func (s *setting[C]) AddEtcDirectory() *setting[C] { +func (s *Settings[C]) AddEtcDirectory() *Settings[C] { s.Lock() defer s.Unlock() @@ -125,7 +125,7 @@ func (s *setting[C]) AddEtcDirectory() *setting[C] { // Add the user configuration directory to the configuration directory // The mnemonic must be set for this function -func (s *setting[C]) AddUserConfigDirectory() *setting[C] { +func (s *Settings[C]) AddUserConfigDirectory() *Settings[C] { if s.mnemonic == "" { s.errors = append(s.errors, MnemonicEmptyError) @@ -149,14 +149,14 @@ func (s *setting[C]) AddUserConfigDirectory() *setting[C] { // Add the current working directory, the user configuration directory // and the Unix etc directory to the configuration directory -func (s *setting[C]) SetDefaultDirectories() *setting[C] { +func (s *Settings[C]) SetDefaultDirectories() *Settings[C] { s.AddWorkingDirectory(). AddUserConfigDirectory(). AddEtcDirectory() return s } -func (s *setting[C]) SetFileFormat(format Format) *setting[C] { +func (s *Settings[C]) SetFileFormat(format Format) *Settings[C] { if slices.Contains(availableFormats, format) { s.files.format = format @@ -168,7 +168,7 @@ func (s *setting[C]) SetFileFormat(format Format) *setting[C] { } // Set the file name without extension -func (s *setting[C]) SetFileName(name string) *setting[C] { +func (s *Settings[C]) SetFileName(name string) *Settings[C] { if name == "" { s.errors = append(s.errors, FileNameEmptyError) @@ -179,7 +179,7 @@ func (s *setting[C]) SetFileName(name string) *setting[C] { return s } -func (s *setting[C]) SetFilesystem(f fs.FS) *setting[C] { +func (s *Settings[C]) SetFilesystem(f fs.FS) *Settings[C] { s.files.fs = f return s } diff --git a/flags.go b/flags.go index b43df082bc9eb29a94cad9966165a6f4e5c0f6fb..c9d75b849583f69b67a42cf139504e0bd7ec5874 100644 --- a/flags.go +++ b/flags.go @@ -8,7 +8,7 @@ import ( // AddFileFromFlagSet adds a file to the configuration // The file is read from the flag specified by the name -func (s *setting[C]) AddFileFromFlagSet(flagset *flag.FlagSet, name string, format Format) *setting[C] { +func (s *Settings[C]) AddFileFromFlagSet(flagset *flag.FlagSet, name string, format Format) *Settings[C] { flag := flagset.Lookup(name) if flag == nil { @@ -26,7 +26,7 @@ func (s *setting[C]) AddFileFromFlagSet(flagset *flag.FlagSet, name string, form } // InitFromFlagSet initializes the configuration from the command line flags. -func (s *setting[C]) InitFromFlagSet(flagset *flag.FlagSet) *setting[C] { +func (s *Settings[C]) InitFromFlagSet(flagset *flag.FlagSet) *Settings[C] { s.Lock() defer s.Unlock() diff --git a/http-handler.go b/http-handler.go index 59b3e94187eba2a5ba3f5e02d912b6c7d8f769dd..c8f9bd10c7e01e55d4d7726f169aab9bc2af3457 100644 --- a/http-handler.go +++ b/http-handler.go @@ -9,7 +9,7 @@ import ( // ContextKey is the key used to store the configuration in the request context // This is used by the middleware -func (s *setting[C]) Middleware(next http.Handler) http.Handler { +func (s *Settings[C]) Middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() ctx = context.WithValue(ctx, contextKey, s.config) @@ -19,7 +19,7 @@ func (s *setting[C]) Middleware(next http.Handler) http.Handler { } // serveGet handles GET requests -func (s *setting[C]) serveGet(w http.ResponseWriter, r *http.Request) { +func (s *Settings[C]) serveGet(w http.ResponseWriter, r *http.Request) { n := negotiation.New(r.Header) m := n.Type("application/json", "text/json", "application/yaml", "text/yaml", "application/toml", "text/toml", "application/properties", "text/properties", "text/x-java-properties", "text/x-properties") @@ -56,7 +56,7 @@ func (s *setting[C]) serveGet(w http.ResponseWriter, r *http.Request) { } -func (s *setting[C]) servePost(w http.ResponseWriter, r *http.Request) { +func (s *Settings[C]) servePost(w http.ResponseWriter, r *http.Request) { n := negotiation.New(r.Header) m := n.ContentType("application/json", "text/json", "application/yaml", "text/yaml", "application/toml", "text/toml", "application/properties", "text/properties", "text/x-java-properties", "text/x-properties") @@ -93,7 +93,7 @@ func (s *setting[C]) servePost(w http.ResponseWriter, r *http.Request) { } // ServeHTTP implements the http.Handler interface -func (s *setting[C]) ServeHTTP(w http.ResponseWriter, r *http.Request) { +func (s *Settings[C]) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: diff --git a/import.go b/import.go index 64140cb61b6e796e2b3412b768c03cc6102ffb79..82238ed1bbcc47a9f31a5cfed833a118650f09b2 100644 --- a/import.go +++ b/import.go @@ -42,7 +42,7 @@ func importProperties[C any](config *C, reader io.Reader) error { } -func (s *setting[C]) importStream(r reader) { +func (s *Settings[C]) importStream(r reader) { var c C var err error @@ -73,17 +73,17 @@ func (s *setting[C]) importStream(r reader) { } } -func (s *setting[C]) importStreams() { +func (s *Settings[C]) importStreams() { for _, r := range s.stream.readers { s.importStream(r) } } -func (s *setting[C]) importFiles() { +func (s *Settings[C]) importFiles() { s.fileWatch.Lock() defer s.fileWatch.Unlock() - + // new files may have been added s.fileWatch.watchList = make(map[string]string) @@ -120,7 +120,7 @@ func (s *setting[C]) importFiles() { } -func (s *setting[C]) Import() *setting[C] { +func (s *Settings[C]) Import() *Settings[C] { s.Lock() defer s.Unlock() diff --git a/settings.go b/settings.go index 463d0f9dd8835a39ea766c4cfe62e967b82bcd6b..1828db4e70bffd7cb64281ef216fbc33a498a896 100644 --- a/settings.go +++ b/settings.go @@ -15,7 +15,7 @@ type fileWatch struct { onWatch bool } -type setting[C any] struct { +type Settings[C any] struct { files fileBackend stream streamBackend config C @@ -30,7 +30,7 @@ type setting[C any] struct { fileWatch fileWatch } -func (s *setting[C]) initDefaults() *setting[C] { +func (s *Settings[C]) initDefaults() *Settings[C] { err := runOnTags(&s.config, []string{"default"}, func(v string, field reflect.Value) { diff --git a/stream.go b/stream.go index b7e052655bad3159755b5c6cd70ad7380c278569..035796b62afd84736bca1b267d9345ac2eb7d314 100644 --- a/stream.go +++ b/stream.go @@ -20,20 +20,20 @@ type streamBackend struct { //type StreamOption struct { //} -//func (s *setting[C]) AddStream(stream io.ReadWriter, format Format) *setting[C] { +//func (s *Settings[C]) AddStream(stream io.ReadWriter, format Format) *Settings[C] { // return s. // AddReader(stream, format) // //AddWriter(stream, format) //} -func (s *setting[C]) AddReader(r io.Reader, format Format) *setting[C] { +func (s *Settings[C]) AddReader(r io.Reader, format Format) *Settings[C] { s.Lock() defer s.Unlock() s.stream.readers = append(s.stream.readers, reader{format, r}) return s } -//func (s *setting[C]) AddWriter(w io.Writer, format Format) *setting[C] { +//func (s *Settings[C]) AddWriter(w io.Writer, format Format) *Settings[C] { // s.Lock() // defer s.Unlock() // s.stream.writers = append(s.stream.writers, writer{format, w}) diff --git a/watch.go b/watch.go index 3556ff55e5c4c26c6c59840faa11bbc098066bbf..818c03b2d9696d02cad2756bf41f6aacc9f19f05 100644 --- a/watch.go +++ b/watch.go @@ -4,7 +4,7 @@ import ( "github.com/fsnotify/fsnotify" ) -func (s *setting[C]) initWatch() *setting[C] { +func (s *Settings[C]) initWatch() *Settings[C] { var err error @@ -23,7 +23,7 @@ func (s *setting[C]) initWatch() *setting[C] { } -func (s *setting[C]) StopWatching() *setting[C] { +func (s *Settings[C]) StopWatching() *Settings[C] { s.fileWatch.Lock() defer s.fileWatch.Unlock() @@ -44,7 +44,7 @@ func (s *setting[C]) StopWatching() *setting[C] { } // Watch the given file for changes -func (s *setting[C]) Watch() *setting[C] { +func (s *Settings[C]) Watch() *Settings[C] { s.fileWatch.Lock() defer s.fileWatch.Unlock()