@@ -6,13 +6,18 @@ import (
66 "github.com/spf13/cobra"
77
88 "github.com/opf/openproject-cli/components/launch"
9+ "github.com/opf/openproject-cli/components/presenter"
910 "github.com/opf/openproject-cli/components/printer"
1011 "github.com/opf/openproject-cli/components/resources/work_packages"
1112 "github.com/opf/openproject-cli/components/routes"
13+ "github.com/opf/openproject-cli/models"
1214)
1315
1416var projectId uint64
17+ var parentWorkPackageID uint64
1518var shouldOpenWorkPackageInBrowser bool
19+ var printCreatedWorkPackageAsJSON bool
20+ var dryRunCreateWorkPackage bool
1621var typeFlag string
1722
1823var createWorkPackageCmd = & cobra.Command {
@@ -24,14 +29,56 @@ var createWorkPackageCmd = &cobra.Command{
2429
2530func createWorkPackage (_ * cobra.Command , args []string ) {
2631 if len (args ) != 1 {
27- printer .ErrorText (fmt .Sprintf ("Expected 1 argument [subject], but got %d" , len (args )))
32+ printCreateError ("invalid_argument" , fmt .Sprintf ("Expected 1 argument [subject], but got %d" , len (args )))
33+ return
34+ }
35+
36+ if err := validateCreateWorkPackageFlags (); err != nil {
37+ printCreateError ("conflicting_arguments" , err .Error ())
2838 return
2939 }
3040
3141 subject := args [0 ]
32- workPackage , err := work_packages .Create (projectId , createOptions (subject ))
42+ options := createOptions (subject )
43+
44+ if dryRunCreateWorkPackage {
45+ plan , err := work_packages .DryRunCreate (projectId , options )
46+ if err != nil {
47+ printCreateError ("invalid_argument" , err .Error ())
48+ return
49+ }
50+
51+ data , err := presenter .MarshalJSON (plan )
52+ if err != nil {
53+ printer .Error (err )
54+ return
55+ }
56+
57+ printer .Info (string (data ))
58+ return
59+ }
60+
61+ workPackage , err := work_packages .Create (projectId , options )
3362 if err != nil {
34- printer .Error (err )
63+ printCreateError ("api_error" , err .Error ())
64+ return
65+ }
66+
67+ if printCreatedWorkPackageAsJSON {
68+ payload , err := work_packages .InspectWithChildren (workPackage .Id )
69+ if err != nil {
70+ printCreateError ("api_error" , err .Error ())
71+ return
72+ }
73+ payload .Children = []models.WorkPackageSummary {}
74+
75+ data , err := presenter .MarshalJSON (payload )
76+ if err != nil {
77+ printer .Error (err )
78+ return
79+ }
80+
81+ printer .Info (string (data ))
3582 return
3683 }
3784
@@ -54,5 +101,32 @@ func createOptions(subject string) map[work_packages.CreateOption]string {
54101 options [work_packages .CreateType ] = typeFlag
55102 }
56103
104+ if parentWorkPackageID > 0 {
105+ options [work_packages .CreateParent ] = fmt .Sprintf ("%d" , parentWorkPackageID )
106+ }
107+
57108 return options
58109}
110+
111+ func validateCreateWorkPackageFlags () error {
112+ if shouldOpenWorkPackageInBrowser && printCreatedWorkPackageAsJSON {
113+ return fmt .Errorf ("cannot use --open together with --json" )
114+ }
115+
116+ return nil
117+ }
118+
119+ func printCreateError (code , message string ) {
120+ if ! printCreatedWorkPackageAsJSON {
121+ printer .ErrorText (message )
122+ return
123+ }
124+
125+ data , err := presenter .MarshalError (code , message )
126+ if err != nil {
127+ printer .Error (err )
128+ return
129+ }
130+
131+ printer .Info (string (data ))
132+ }
0 commit comments