Skip to content

Commit fef1370

Browse files
Merge pull request #268 from dropbox/mkdir-json-output
Add --output=json support to mkdir command
2 parents 3dc75e1 + 7f6cd3f commit fef1370

3 files changed

Lines changed: 368 additions & 6 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ Text output is the default. JSON output is available through the global `--outpu
138138

139139
```sh
140140
$ dbxcli <command> --output=json
141+
$ dbxcli mkdir --output=json /new-folder
141142
$ dbxcli rm --output=json /old-file.txt
142143
$ dbxcli restore --output=json /Reports/old.pdf 015f...
143144
```

cmd/mkdir.go

Lines changed: 101 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,23 @@ package cmd
1616

1717
import (
1818
"errors"
19+
"fmt"
1920
"strings"
2021

2122
"github.com/dropbox/dropbox-sdk-go-unofficial/v6/dropbox/files"
2223
"github.com/spf13/cobra"
2324
)
2425

26+
type mkdirInput struct {
27+
Path string `json:"path"`
28+
Parents bool `json:"parents"`
29+
}
30+
31+
type mkdirResult struct {
32+
Input mkdirInput `json:"input"`
33+
Result jsonMetadata `json:"result"`
34+
}
35+
2536
func mkdir(cmd *cobra.Command, args []string) (err error) {
2637
if len(args) != 1 {
2738
return errors.New("`mkdir` requires a `directory` argument")
@@ -36,15 +47,98 @@ func mkdir(cmd *cobra.Command, args []string) (err error) {
3647

3748
parents, _ := cmd.Flags().GetBool("parents")
3849

39-
dbx := files.New(config)
40-
if _, err = dbx.CreateFolderV2(arg); err != nil {
41-
if parents && isConflictError(err) {
42-
return nil
50+
dbx := filesNewFunc(config)
51+
created, err := dbx.CreateFolderV2(arg)
52+
var metadata *files.FolderMetadata
53+
if err != nil {
54+
if !parents {
55+
return err
4356
}
44-
return
57+
58+
conflictTag, ok := createFolderConflictTag(err)
59+
switch {
60+
case ok && conflictTag == files.WriteConflictErrorFolder:
61+
if commandOutputFormat(cmd) == "text" {
62+
return nil
63+
}
64+
metadata, err = existingFolderMetadata(dbx, dst)
65+
if err != nil {
66+
return err
67+
}
68+
case ok && (conflictTag == files.WriteConflictErrorFile || conflictTag == files.WriteConflictErrorFileAncestor):
69+
return fmt.Errorf("path exists and is not a folder: %s", dst)
70+
case ok:
71+
return err
72+
case isConflictError(err):
73+
if commandOutputFormat(cmd) == "text" {
74+
return nil
75+
}
76+
metadata, err = existingFolderMetadata(dbx, dst)
77+
if err != nil {
78+
return err
79+
}
80+
default:
81+
return err
82+
}
83+
} else {
84+
if created == nil || created.Metadata == nil {
85+
return errors.New("create folder returned no metadata")
86+
}
87+
metadata = created.Metadata
4588
}
4689

47-
return
90+
result := newMkdirResult(dst, parents, metadata)
91+
return commandOutput(cmd).Render(nil, result)
92+
}
93+
94+
func existingFolderMetadata(dbx files.Client, dst string) (*files.FolderMetadata, error) {
95+
metadata, err := dbx.GetMetadata(files.NewGetMetadataArg(dst))
96+
if err != nil {
97+
return nil, err
98+
}
99+
folder, ok := metadata.(*files.FolderMetadata)
100+
if !ok || folder == nil {
101+
return nil, fmt.Errorf("path exists and is not a folder: %s", dst)
102+
}
103+
return folder, nil
104+
}
105+
106+
func newMkdirResult(path string, parents bool, metadata *files.FolderMetadata) mkdirResult {
107+
result := jsonMetadataFromDropbox(metadata)
108+
result.PathDisplay = metadataDisplayPath(path, result.PathDisplay)
109+
110+
return mkdirResult{
111+
Input: mkdirInput{
112+
Path: path,
113+
Parents: parents,
114+
},
115+
Result: result,
116+
}
117+
}
118+
119+
func createFolderConflictTag(err error) (string, bool) {
120+
var apiErrPtr *files.CreateFolderV2APIError
121+
if errors.As(err, &apiErrPtr) && apiErrPtr != nil {
122+
return createFolderEndpointConflictTag(apiErrPtr.EndpointError)
123+
}
124+
125+
var apiErr files.CreateFolderV2APIError
126+
if errors.As(err, &apiErr) {
127+
return createFolderEndpointConflictTag(apiErr.EndpointError)
128+
}
129+
130+
return "", false
131+
}
132+
133+
func createFolderEndpointConflictTag(endpointErr *files.CreateFolderError) (string, bool) {
134+
if endpointErr == nil ||
135+
endpointErr.Tag != files.CreateFolderErrorPath ||
136+
endpointErr.Path == nil ||
137+
endpointErr.Path.Tag != files.WriteErrorConflict ||
138+
endpointErr.Path.Conflict == nil {
139+
return "", false
140+
}
141+
return endpointErr.Path.Conflict.Tag, true
48142
}
49143

50144
func isConflictError(err error) bool {
@@ -61,4 +155,5 @@ var mkdirCmd = &cobra.Command{
61155
func init() {
62156
RootCmd.AddCommand(mkdirCmd)
63157
mkdirCmd.Flags().BoolP("parents", "p", false, "No error if existing, create parent directories as needed")
158+
enableStructuredOutput(mkdirCmd)
64159
}

0 commit comments

Comments
 (0)