@@ -16,12 +16,23 @@ package cmd
1616
1717import (
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+
2536func 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
50144func isConflictError (err error ) bool {
@@ -61,4 +155,5 @@ var mkdirCmd = &cobra.Command{
61155func 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