@@ -60,6 +60,9 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
6060 args = cobra .ExactArgs (0 )
6161 }
6262 createArgs := map [string ]interface {}{}
63+ var dataContent map [string ]interface {}
64+ createArgs ["data" ] = & dataContent
65+
6366 createCmd := & cobra.Command {
6467 Use : use ,
6568 Short : fmt .Sprintf ("Create a %v" , strings .ToLower (r .Singular )),
@@ -72,14 +75,17 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
7275 }
7376 jsonBody , err := generateJsonPayload (cmd , createArgs )
7477 if err != nil {
75- slog .Error (fmt .Sprintf ("unable to create json body for update : %v" , err ))
78+ slog .Error (fmt .Sprintf ("unable to create json body for create : %v" , err ))
7679 }
7780 req , err = http .NewRequest ("POST" , p , strings .NewReader (string (jsonBody )))
7881 if err != nil {
7982 slog .Error (fmt .Sprintf ("error creating post request: %v" , err ))
8083 }
8184 },
8285 }
86+
87+ createCmd .Flags ().Var (& DataFlag {& dataContent }, "@data" , "Read resource data from JSON file" )
88+
8389 addSchemaFlags (createCmd , * r .Schema , createArgs )
8490 c .AddCommand (createCmd )
8591 }
@@ -101,6 +107,9 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
101107 if r .Methods .Update != nil {
102108
103109 updateArgs := map [string ]interface {}{}
110+ var updateDataContent map [string ]interface {}
111+ updateArgs ["data" ] = & updateDataContent
112+
104113 updateCmd := & cobra.Command {
105114 Use : "update [id]" ,
106115 Short : fmt .Sprintf ("Update a %v" , strings .ToLower (r .Singular )),
@@ -118,6 +127,9 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
118127 }
119128 },
120129 }
130+
131+ updateCmd .Flags ().Var (& DataFlag {& updateDataContent }, "@data" , "Read resource data from JSON file" )
132+
121133 addSchemaFlags (updateCmd , * r .Schema , updateArgs )
122134 c .AddCommand (updateCmd )
123135 }
@@ -151,6 +163,8 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
151163 }
152164 for _ , cm := range r .CustomMethods {
153165 customArgs := map [string ]interface {}{}
166+ var customDataContent map [string ]interface {}
167+
154168 customCmd := & cobra.Command {
155169 Use : fmt .Sprintf (":%s [id]" , cm .Name ),
156170 Short : fmt .Sprintf ("%v a %v" , cm .Method , strings .ToLower (r .Singular )),
@@ -161,15 +175,18 @@ func ExecuteResourceCommand(r *api.Resource, args []string) (*http.Request, stri
161175 if cm .Method == "POST" {
162176 jsonBody , inner_err := generateJsonPayload (cmd , customArgs )
163177 if inner_err != nil {
164- slog .Error (fmt .Sprintf ("unable to create json body for update : %v" , inner_err ))
178+ slog .Error (fmt .Sprintf ("unable to create json body for custom method : %v" , inner_err ))
165179 }
166180 req , err = http .NewRequest (cm .Method , p , strings .NewReader (string (jsonBody )))
167181 } else {
168182 req , err = http .NewRequest (cm .Method , p , nil )
169183 }
170184 },
171185 }
186+
172187 if cm .Method == "POST" {
188+ customArgs ["data" ] = & customDataContent
189+ customCmd .Flags ().Var (& DataFlag {& customDataContent }, "@data" , "Read resource data from JSON file" )
173190 addSchemaFlags (customCmd , * cm .Request , customArgs )
174191 }
175192 c .AddCommand (customCmd )
@@ -229,8 +246,45 @@ func addSchemaFlags(c *cobra.Command, schema openapi.Schema, args map[string]int
229246}
230247
231248func generateJsonPayload (c * cobra.Command , args map [string ]interface {}) (string , error ) {
249+ // Check if --@data flag was used
250+ dataFlag := c .Flags ().Lookup ("@data" )
251+ if dataFlag != nil && dataFlag .Changed {
252+ // Check for conflicts with other flags
253+ var conflictingFlags []string
254+ for key := range args {
255+ if key == "data" {
256+ continue // Skip the internal data key
257+ }
258+ if flag := c .Flags ().Lookup (key ); flag != nil && flag .Changed {
259+ conflictingFlags = append (conflictingFlags , "--" + key )
260+ }
261+ }
262+
263+ if len (conflictingFlags ) > 0 {
264+ return "" , fmt .Errorf ("--@data flag cannot be used with individual field flags (%s)" , strings .Join (conflictingFlags , ", " ))
265+ }
266+
267+ // Get the data from the --@data flag
268+ if dataValue , ok := args ["data" ]; ok {
269+ if dataMap , ok := dataValue .(* map [string ]interface {}); ok && * dataMap != nil {
270+ jsonBody , err := json .Marshal (* dataMap )
271+ if err != nil {
272+ return "" , fmt .Errorf ("error marshalling JSON from --@data: %v" , err )
273+ }
274+ return string (jsonBody ), nil
275+ }
276+ }
277+
278+ // If --@data flag was used but no data was set, return empty object
279+ return "{}" , nil
280+ }
281+
282+ // Original logic for individual flags
232283 body := map [string ]interface {}{}
233284 for key , value := range args {
285+ if key == "data" {
286+ continue // Skip the data field when building from individual flags
287+ }
234288 if c .Flags ().Lookup (key ).Changed {
235289 body [key ] = value
236290 }
0 commit comments