mirror of
https://github.com/rclone/rclone.git
synced 2025-12-11 22:14:05 +01:00
fs: split overgrown fs.go (#5405)
Nothing is added or removed and no package is renamed by this change. Just rearrange definitions between source files in the fs directory. New source files: - types.go Filesystem types and interfaces - features.go Features and optional interfaces - registry.go Filesystem registry and backend options - newfs.go NewFs and its helpers - configmap.go Getters and Setters for ConfigMap - pacer.go Pacer with logging and calculator The final fs.go contains what is left. Also rename options.go to open_options.go to dissociate from registry options.
This commit is contained in:
128
fs/configmap.go
Normal file
128
fs/configmap.go
Normal file
@@ -0,0 +1,128 @@
|
||||
// Getters and Setters for ConfigMap
|
||||
|
||||
package fs
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/rclone/rclone/fs/config/configmap"
|
||||
)
|
||||
|
||||
// A configmap.Getter to read from the environment RCLONE_CONFIG_backend_option_name
|
||||
type configEnvVars string
|
||||
|
||||
// Get a config item from the environment variables if possible
|
||||
func (configName configEnvVars) Get(key string) (value string, ok bool) {
|
||||
return os.LookupEnv(ConfigToEnv(string(configName), key))
|
||||
}
|
||||
|
||||
// A configmap.Getter to read from the environment RCLONE_option_name
|
||||
type optionEnvVars struct {
|
||||
fsInfo *RegInfo
|
||||
}
|
||||
|
||||
// Get a config item from the option environment variables if possible
|
||||
func (oev optionEnvVars) Get(key string) (value string, ok bool) {
|
||||
opt := oev.fsInfo.Options.Get(key)
|
||||
if opt == nil {
|
||||
return "", false
|
||||
}
|
||||
// For options with NoPrefix set, check without prefix too
|
||||
if opt.NoPrefix {
|
||||
value, ok = os.LookupEnv(OptionToEnv(key))
|
||||
if ok {
|
||||
return value, ok
|
||||
}
|
||||
}
|
||||
return os.LookupEnv(OptionToEnv(oev.fsInfo.Prefix + "-" + key))
|
||||
}
|
||||
|
||||
// A configmap.Getter to read either the default value or the set
|
||||
// value from the RegInfo.Options
|
||||
type regInfoValues struct {
|
||||
fsInfo *RegInfo
|
||||
useDefault bool
|
||||
}
|
||||
|
||||
// override the values in configMap with the either the flag values or
|
||||
// the default values
|
||||
func (r *regInfoValues) Get(key string) (value string, ok bool) {
|
||||
opt := r.fsInfo.Options.Get(key)
|
||||
if opt != nil && (r.useDefault || opt.Value != nil) {
|
||||
return opt.String(), true
|
||||
}
|
||||
return "", false
|
||||
}
|
||||
|
||||
// A configmap.Setter to read from the config file
|
||||
type setConfigFile string
|
||||
|
||||
// Set a config item into the config file
|
||||
func (section setConfigFile) Set(key, value string) {
|
||||
if strings.HasPrefix(string(section), ":") {
|
||||
Logf(nil, "Can't save config %q = %q for on the fly backend %q", key, value, section)
|
||||
return
|
||||
}
|
||||
Debugf(nil, "Saving config %q = %q in section %q of the config file", key, value, section)
|
||||
err := ConfigFileSet(string(section), key, value)
|
||||
if err != nil {
|
||||
Errorf(nil, "Failed saving config %q = %q in section %q of the config file: %v", key, value, section, err)
|
||||
}
|
||||
}
|
||||
|
||||
// A configmap.Getter to read from the config file
|
||||
type getConfigFile string
|
||||
|
||||
// Get a config item from the config file
|
||||
func (section getConfigFile) Get(key string) (value string, ok bool) {
|
||||
value, ok = ConfigFileGet(string(section), key)
|
||||
// Ignore empty lines in the config file
|
||||
if value == "" {
|
||||
ok = false
|
||||
}
|
||||
return value, ok
|
||||
}
|
||||
|
||||
// ConfigMap creates a configmap.Map from the *RegInfo and the
|
||||
// configName passed in. If connectionStringConfig has any entries (it may be nil),
|
||||
// then it will be added to the lookup with the highest priority.
|
||||
//
|
||||
// If fsInfo is nil then the returned configmap.Map should only be
|
||||
// used for reading non backend specific parameters, such as "type".
|
||||
func ConfigMap(fsInfo *RegInfo, configName string, connectionStringConfig configmap.Simple) (config *configmap.Map) {
|
||||
// Create the config
|
||||
config = configmap.New()
|
||||
|
||||
// Read the config, more specific to least specific
|
||||
|
||||
// Config from connection string
|
||||
if len(connectionStringConfig) > 0 {
|
||||
config.AddGetter(connectionStringConfig, configmap.PriorityNormal)
|
||||
}
|
||||
|
||||
// flag values
|
||||
if fsInfo != nil {
|
||||
config.AddGetter(®InfoValues{fsInfo, false}, configmap.PriorityNormal)
|
||||
}
|
||||
|
||||
// remote specific environment vars
|
||||
config.AddGetter(configEnvVars(configName), configmap.PriorityNormal)
|
||||
|
||||
// backend specific environment vars
|
||||
if fsInfo != nil {
|
||||
config.AddGetter(optionEnvVars{fsInfo: fsInfo}, configmap.PriorityNormal)
|
||||
}
|
||||
|
||||
// config file
|
||||
config.AddGetter(getConfigFile(configName), configmap.PriorityConfig)
|
||||
|
||||
// default values
|
||||
if fsInfo != nil {
|
||||
config.AddGetter(®InfoValues{fsInfo, true}, configmap.PriorityDefault)
|
||||
}
|
||||
|
||||
// Set Config
|
||||
config.AddSetter(setConfigFile(configName))
|
||||
return config
|
||||
}
|
||||
Reference in New Issue
Block a user