mirror of
https://github.com/rclone/rclone.git
synced 2024-12-19 17:34:05 +08:00
82 lines
2.7 KiB
Go
82 lines
2.7 KiB
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/url"
|
||
|
"path"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// Some presets for different amounts of information that can be requested for fields;
|
||
|
// it is recommended to only request the information that is actually needed.
|
||
|
var (
|
||
|
HiDriveObjectNoMetadataFields = []string{"name", "type"}
|
||
|
HiDriveObjectWithMetadataFields = append(HiDriveObjectNoMetadataFields, "id", "size", "mtime", "chash")
|
||
|
HiDriveObjectWithDirectoryMetadataFields = append(HiDriveObjectWithMetadataFields, "nmembers")
|
||
|
DirectoryContentFields = []string{"nmembers"}
|
||
|
)
|
||
|
|
||
|
// QueryParameters represents the parameters passed to an API-call.
|
||
|
type QueryParameters struct {
|
||
|
url.Values
|
||
|
}
|
||
|
|
||
|
// NewQueryParameters initializes an instance of QueryParameters and
|
||
|
// returns a pointer to it.
|
||
|
func NewQueryParameters() *QueryParameters {
|
||
|
return &QueryParameters{url.Values{}}
|
||
|
}
|
||
|
|
||
|
// SetFileInDirectory sets the appropriate parameters
|
||
|
// to specify a path to a file in a directory.
|
||
|
// This is used by requests that work with paths for files that do not exist yet.
|
||
|
// (For example when creating a file).
|
||
|
// Most requests use the format produced by SetPath(...).
|
||
|
func (p *QueryParameters) SetFileInDirectory(filePath string) {
|
||
|
directory, file := path.Split(path.Clean(filePath))
|
||
|
p.Set("dir", path.Clean(directory))
|
||
|
p.Set("name", file)
|
||
|
// NOTE: It would be possible to switch to pid-based requests
|
||
|
// by modifying this function.
|
||
|
}
|
||
|
|
||
|
// SetPath sets the appropriate parameters to access the given path.
|
||
|
func (p *QueryParameters) SetPath(objectPath string) {
|
||
|
p.Set("path", path.Clean(objectPath))
|
||
|
// NOTE: It would be possible to switch to pid-based requests
|
||
|
// by modifying this function.
|
||
|
}
|
||
|
|
||
|
// SetTime sets the key to the time-value. It replaces any existing values.
|
||
|
func (p *QueryParameters) SetTime(key string, value time.Time) error {
|
||
|
valueAPI := Time(value)
|
||
|
valueBytes, err := json.Marshal(&valueAPI)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
p.Set(key, string(valueBytes))
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// AddList adds the given values as a list
|
||
|
// with each value separated by the separator.
|
||
|
// It appends to any existing values associated with key.
|
||
|
func (p *QueryParameters) AddList(key string, separator string, values ...string) {
|
||
|
original := p.Get(key)
|
||
|
p.Set(key, strings.Join(values, separator))
|
||
|
if original != "" {
|
||
|
p.Set(key, original+separator+p.Get(key))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// AddFields sets the appropriate parameter to access the given fields.
|
||
|
// The given fields will be appended to any other existing fields.
|
||
|
func (p *QueryParameters) AddFields(prefix string, fields ...string) {
|
||
|
modifiedFields := make([]string, len(fields))
|
||
|
for i, field := range fields {
|
||
|
modifiedFields[i] = prefix + field
|
||
|
}
|
||
|
p.AddList("fields", ",", modifiedFields...)
|
||
|
}
|