summaryrefslogtreecommitdiff
path: root/plugins/config/plugin.go
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2020-12-26 00:47:21 +0300
committerGitHub <[email protected]>2020-12-26 00:47:21 +0300
commit566d7f4c95eb5dedcb2da5afcda4bbea8eba077f (patch)
tree0007a6b8c8ac9e7d31b8a5f3f7f27669c860d261 /plugins/config/plugin.go
parent1bc3db2ea9b95edd0101676d7bfd75df3782c3bd (diff)
parent7a0dee1a416705c621edbf50e1f43fb39845348f (diff)
Merge pull request #463 from spiral/experiment/core_pluginsv2.0.0-beta1
[RR2] Plugins
Diffstat (limited to 'plugins/config/plugin.go')
-rwxr-xr-xplugins/config/plugin.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/plugins/config/plugin.go b/plugins/config/plugin.go
new file mode 100755
index 00000000..1a170448
--- /dev/null
+++ b/plugins/config/plugin.go
@@ -0,0 +1,75 @@
+package config
+
+import (
+ "bytes"
+ "strings"
+
+ "github.com/spf13/viper"
+ "github.com/spiral/errors"
+)
+
+type Viper struct {
+ viper *viper.Viper
+ Path string
+ Prefix string
+ Type string
+ ReadInCfg []byte
+}
+
+// Inits config provider.
+func (v *Viper) Init() error {
+ const op = errors.Op("viper plugin init")
+ v.viper = viper.New()
+ // If user provided []byte data with config, read it and ignore Path and Prefix
+ if v.ReadInCfg != nil && v.Type != "" {
+ v.viper.SetConfigType("yaml")
+ return v.viper.ReadConfig(bytes.NewBuffer(v.ReadInCfg))
+ }
+
+ // read in environment variables that match
+ v.viper.AutomaticEnv()
+ if v.Prefix == "" {
+ return errors.E(op, errors.Str("prefix should be set"))
+ }
+
+ v.viper.SetEnvPrefix(v.Prefix)
+ if v.Path == "" {
+ return errors.E(op, errors.Str("path should be set"))
+ }
+
+ v.viper.SetConfigFile(v.Path)
+ v.viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
+
+ return v.viper.ReadInConfig()
+}
+
+// Overwrite overwrites existing config with provided values
+func (v *Viper) Overwrite(values map[string]interface{}) error {
+ if len(values) != 0 {
+ for key, value := range values {
+ v.viper.Set(key, value)
+ }
+ }
+
+ return nil
+}
+
+// UnmarshalKey reads configuration section into configuration object.
+func (v *Viper) UnmarshalKey(name string, out interface{}) error {
+ const op = errors.Op("unmarshal key")
+ err := v.viper.UnmarshalKey(name, &out)
+ if err != nil {
+ return errors.E(op, err)
+ }
+ return nil
+}
+
+// Get raw config in a form of config section.
+func (v *Viper) Get(name string) interface{} {
+ return v.viper.Get(name)
+}
+
+// Has checks if config section exists.
+func (v *Viper) Has(name string) bool {
+ return v.viper.IsSet(name)
+}