@@ -3,6 +3,7 @@ package cmd
3
3
import (
4
4
"fmt"
5
5
6
+ "github.com/AlecAivazis/survey/v2"
6
7
"github.com/b4b4r07/afx/pkg/errors"
7
8
"github.com/b4b4r07/afx/pkg/helpers/templates"
8
9
"github.com/fatih/color"
@@ -11,6 +12,12 @@ import (
11
12
12
13
type stateCmd struct {
13
14
meta
15
+
16
+ opt stateOpt
17
+ }
18
+
19
+ type stateOpt struct {
20
+ force bool
14
21
}
15
22
16
23
var (
23
30
24
31
// newStateCmd creates a new state command
25
32
func newStateCmd () * cobra.Command {
33
+ c := & stateCmd {}
34
+
26
35
stateCmd := & cobra.Command {
27
- Use : "state [list|refresh]" ,
36
+ Use : "state [list|refresh|remove ]" ,
28
37
Short : "Advanced state management" ,
29
38
Long : stateLong ,
30
39
Example : stateExample ,
@@ -33,68 +42,106 @@ func newStateCmd() *cobra.Command {
33
42
SilenceErrors : true ,
34
43
Args : cobra .MaximumNArgs (1 ),
35
44
Hidden : true ,
45
+ PostRunE : func (cmd * cobra.Command , args []string ) error {
46
+ return c .meta .init (args )
47
+ },
36
48
}
37
49
38
- stateListCmd := newStateListCmd ()
39
- stateRefreshCmd := newStateRefreshCmd ()
40
- stateRefreshCmd .Flags ().BoolP ("force" , "" , false , "Force update" )
41
-
42
50
stateCmd .AddCommand (
43
- stateListCmd ,
44
- stateRefreshCmd ,
51
+ c .newStateListCmd (),
52
+ c .newStateRefreshCmd (),
53
+ c .newStateRemoveCmd (),
45
54
)
46
55
47
56
return stateCmd
48
57
}
49
58
50
- func newStateListCmd () * cobra.Command {
51
- c := & stateCmd {}
52
-
59
+ func (c stateCmd ) newStateListCmd () * cobra.Command {
53
60
return & cobra.Command {
54
61
Use : "list" ,
55
62
Short : "List your state items" ,
56
63
DisableFlagsInUseLine : true ,
57
64
SilenceUsage : true ,
58
65
SilenceErrors : true ,
59
- Args : cobra .MaximumNArgs (0 ),
66
+ Args : cobra .ExactArgs (0 ),
60
67
PreRunE : func (cmd * cobra.Command , args []string ) error {
61
68
return c .meta .init (args )
62
69
},
63
- Run : func (cmd * cobra.Command , args []string ) {
64
- for _ , pkg := range c .State .NoChanges {
65
- fmt .Println (pkg .GetName ())
70
+ RunE : func (cmd * cobra.Command , args []string ) error {
71
+ items , err := c .State .List ()
72
+ if err != nil {
73
+ return err
66
74
}
75
+ for _ , item := range items {
76
+ fmt .Println (item )
77
+ }
78
+ return nil
67
79
},
68
80
}
69
81
}
70
82
71
- func newStateRefreshCmd () * cobra.Command {
72
- c := & stateCmd {}
73
-
74
- return & cobra.Command {
83
+ func (c stateCmd ) newStateRefreshCmd () * cobra.Command {
84
+ cmd := & cobra.Command {
75
85
Use : "refresh" ,
76
86
Short : "Refresh your state file" ,
77
87
DisableFlagsInUseLine : true ,
78
88
SilenceUsage : true ,
79
89
SilenceErrors : true ,
80
- Args : cobra .MaximumNArgs (0 ),
90
+ Args : cobra .ExactArgs (0 ),
81
91
PreRunE : func (cmd * cobra.Command , args []string ) error {
82
92
return c .meta .init (args )
83
93
},
84
94
RunE : func (cmd * cobra.Command , args []string ) error {
85
- force , err := cmd .Flags ().GetBool ("force" )
86
- if err != nil {
87
- return err
88
- }
89
- if force {
95
+ if c .opt .force {
90
96
return c .State .New ()
91
97
}
92
-
93
98
if err := c .State .Refresh (); err != nil {
94
99
return errors .Wrap (err , "failed to refresh state" )
95
100
}
96
101
fmt .Println (color .WhiteString ("Successfully refreshed" ))
97
102
return nil
98
103
},
99
104
}
105
+ cmd .Flags ().BoolVarP (& c .opt .force , "force" , "" , false , "force update" )
106
+ return cmd
107
+ }
108
+
109
+ func (c stateCmd ) newStateRemoveCmd () * cobra.Command {
110
+ return & cobra.Command {
111
+ Use : "remove" ,
112
+ Short : "Remove selected packages from state file" ,
113
+ DisableFlagsInUseLine : true ,
114
+ SilenceUsage : true ,
115
+ SilenceErrors : true ,
116
+ Aliases : []string {"rm" },
117
+ Args : cobra .MinimumNArgs (0 ),
118
+ PreRunE : func (cmd * cobra.Command , args []string ) error {
119
+ return c .meta .init (args )
120
+ },
121
+ RunE : func (cmd * cobra.Command , args []string ) error {
122
+ var resources []string
123
+ switch len (cmd .Flags ().Args ()) {
124
+ case 0 :
125
+ list , err := c .State .List ()
126
+ if err != nil {
127
+ return errors .Wrap (err , "failed to list state items" )
128
+ }
129
+ var selected string
130
+ if err := survey .AskOne (& survey.Select {
131
+ Message : "Choose a package:" ,
132
+ Options : list ,
133
+ }, & selected ); err != nil {
134
+ return errors .Wrap (err , "failed to get input from console" )
135
+ }
136
+ resources = append (resources , selected )
137
+ default :
138
+ // TODO: check valid or invalid
139
+ resources = cmd .Flags ().Args ()
140
+ }
141
+ for _ , resource := range resources {
142
+ c .State .Remove (resource )
143
+ }
144
+ return nil
145
+ },
146
+ }
100
147
}
0 commit comments