rc: allow JSON parameters to simplify command line usage
If the parameter being passed is an object then it can be passed as a JSON string rather than using the `--json` flag which simplifies the command line. rclone rc operations/list fs=/tmp remote=test opt='{"showHash": true}' Rather than rclone rc operations/list --json '{"fs": "/tmp", "remote": "test", "opt": {"showHash": true}}'
This commit is contained in:
parent
ff84351655
commit
744828a4de
3 changed files with 39 additions and 0 deletions
|
@ -165,6 +165,8 @@ $ rclone rc rc/noop param1=one param2=two
|
||||||
Run `rclone rc` on its own to see the help for the installed remote
|
Run `rclone rc` on its own to see the help for the installed remote
|
||||||
control commands.
|
control commands.
|
||||||
|
|
||||||
|
## JSON input
|
||||||
|
|
||||||
`rclone rc` also supports a `--json` flag which can be used to send
|
`rclone rc` also supports a `--json` flag which can be used to send
|
||||||
more complicated input parameters.
|
more complicated input parameters.
|
||||||
|
|
||||||
|
@ -184,6 +186,22 @@ $ rclone rc --json '{ "p1": [1,"2",null,4], "p2": { "a":1, "b":2 } }' rc/noop
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If the parameter being passed is an object then it can be passed as a
|
||||||
|
JSON string rather than using the `--json` flag which simplifies the
|
||||||
|
command line.
|
||||||
|
|
||||||
|
```
|
||||||
|
rclone rc operations/list fs=/tmp remote=test opt='{"showHash": true}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Rather than
|
||||||
|
|
||||||
|
```
|
||||||
|
rclone rc operations/list --json '{"fs": "/tmp", "remote": "test", "opt": {"showHash": true}}'
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Special parameters
|
## Special parameters
|
||||||
|
|
||||||
The rc interface supports some special parameters which apply to
|
The rc interface supports some special parameters which apply to
|
||||||
|
|
|
@ -219,6 +219,13 @@ func (p Params) GetStruct(key string, out interface{}) error {
|
||||||
}
|
}
|
||||||
err = Reshape(out, value)
|
err = Reshape(out, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if valueStr, ok := value.(string); ok {
|
||||||
|
// try to unmarshal as JSON if string
|
||||||
|
err = json.Unmarshal([]byte(valueStr), out)
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
return ErrParamInvalid{errors.Wrapf(err, "key %q", key)}
|
return ErrParamInvalid{errors.Wrapf(err, "key %q", key)}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -304,6 +304,20 @@ func TestParamsGetStruct(t *testing.T) {
|
||||||
assert.Equal(t, true, IsErrParamInvalid(e3), e3.Error())
|
assert.Equal(t, true, IsErrParamInvalid(e3), e3.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParamsGetStructString(t *testing.T) {
|
||||||
|
in := Params{
|
||||||
|
"struct": `{"String": "one", "Float": 4.2}`,
|
||||||
|
}
|
||||||
|
var out struct {
|
||||||
|
String string
|
||||||
|
Float float64
|
||||||
|
}
|
||||||
|
e1 := in.GetStruct("struct", &out)
|
||||||
|
assert.NoError(t, e1)
|
||||||
|
assert.Equal(t, "one", out.String)
|
||||||
|
assert.Equal(t, 4.2, out.Float)
|
||||||
|
}
|
||||||
|
|
||||||
func TestParamsGetStructMissingOK(t *testing.T) {
|
func TestParamsGetStructMissingOK(t *testing.T) {
|
||||||
in := Params{
|
in := Params{
|
||||||
"struct": Params{
|
"struct": Params{
|
||||||
|
|
Loading…
Reference in a new issue