From 257f5d279ae2e0c5038a1113a615cae3e88bae48 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 22 Oct 2021 12:42:25 +0100 Subject: [PATCH] filefabric: fix directory move after API change #5734 The API has changed in the directory move call JSON response from returning a TaskID as a string to returning it as an integer. In other places it is still returned as a string though. This patch allows the TaskID to be an integer or a string in the JSON response and keeps it internally as a string like before. --- backend/filefabric/api/types.go | 20 +++++++++++++++++++- backend/filefabric/filefabric.go | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/backend/filefabric/api/types.go b/backend/filefabric/api/types.go index 9ba415326..926ad82a6 100644 --- a/backend/filefabric/api/types.go +++ b/backend/filefabric/api/types.go @@ -69,11 +69,29 @@ func (i *Int) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, (*int)(i)) } +// String represents an string which can be represented in JSON as a +// quoted string or an integer. +type String string + +// MarshalJSON turns a String into JSON +func (s *String) MarshalJSON() (out []byte, err error) { + return json.Marshal((*string)(s)) +} + +// UnmarshalJSON turns JSON into a String +func (s *String) UnmarshalJSON(data []byte) error { + err := json.Unmarshal(data, (*string)(s)) + if err != nil { + *s = String(data) + } + return nil +} + // Status return returned in all status responses type Status struct { Code string `json:"status"` Message string `json:"statusmessage"` - TaskID string `json:"taskid"` + TaskID String `json:"taskid"` // Warning string `json:"warning"` // obsolete } diff --git a/backend/filefabric/filefabric.go b/backend/filefabric/filefabric.go index b4b5e8487..61a303a23 100644 --- a/backend/filefabric/filefabric.go +++ b/backend/filefabric/filefabric.go @@ -844,7 +844,7 @@ func (f *Fs) Purge(ctx context.Context, dir string) error { } // Wait for the the background task to complete if necessary -func (f *Fs) waitForBackgroundTask(ctx context.Context, taskID string) (err error) { +func (f *Fs) waitForBackgroundTask(ctx context.Context, taskID api.String) (err error) { if taskID == "" || taskID == "0" { // No task to wait for return nil