4
4
"encoding/json"
5
5
"errors"
6
6
"fmt"
7
+ "github.com/spf13/pflag"
7
8
"slices"
8
9
"strconv"
9
10
"strings"
@@ -18,8 +19,9 @@ func newComposeCmd() *cobra.Command {
18
19
c := & cobra.Command {
19
20
Use : "compose EVENT" ,
20
21
}
21
- c .AddCommand (newUpCommand ())
22
- c .AddCommand (newDownCommand ())
22
+ upCmd := newUpCommand ()
23
+ downCmd := newDownCommand ()
24
+ c .AddCommand (upCmd , downCmd , newMetadataCommand (upCmd , downCmd ))
23
25
c .Hidden = true
24
26
c .PersistentFlags ().String ("project-name" , "" , "compose project name" ) // unused by model
25
27
@@ -62,19 +64,40 @@ func newUpCommand() *cobra.Command {
62
64
},
63
65
}
64
66
c .Flags ().StringArrayVar (& models , "model" , nil , "model to use" )
67
+ _ = c .MarkFlagRequired ("model" )
65
68
return c
66
69
}
67
70
68
71
func newDownCommand () * cobra.Command {
69
- var model []string
70
72
c := & cobra.Command {
71
73
Use : "down" ,
72
74
RunE : func (cmd * cobra.Command , args []string ) error {
73
75
// No required cleanup on down
74
76
return nil
75
77
},
76
78
}
77
- c .Flags ().StringArrayVar (& model , "model" , nil , "model to use" )
79
+ return c
80
+ }
81
+
82
+ func newMetadataCommand (upCmd , downCmd * cobra.Command ) * cobra.Command {
83
+ c := & cobra.Command {
84
+ Use : "metadata" ,
85
+ Short : "Metadata for Docker Compose" ,
86
+ RunE : func (cmd * cobra.Command , args []string ) error {
87
+ providerMetadata := ProviderMetadata {
88
+ Description : "Docker Model Runner" ,
89
+ }
90
+ providerMetadata .Up = commandParameters (upCmd )
91
+ providerMetadata .Down = commandParameters (downCmd )
92
+
93
+ jsonMetadata , err := json .Marshal (providerMetadata )
94
+ if err != nil {
95
+ return err
96
+ }
97
+ fmt .Printf (string (jsonMetadata ))
98
+ return nil
99
+ },
100
+ }
78
101
return c
79
102
}
80
103
@@ -155,3 +178,36 @@ func sendInfo(s string) error {
155
178
_ , err = fmt .Println (string (marshal ))
156
179
return err
157
180
}
181
+
182
+ func commandParameters (cmd * cobra.Command ) CommandMetadata {
183
+ cmdMetadata := CommandMetadata {}
184
+ cmd .Flags ().VisitAll (func (f * pflag.Flag ) {
185
+ _ , isRequired := f .Annotations [cobra .BashCompOneRequiredFlag ]
186
+ cmdMetadata .Parameters = append (cmdMetadata .Parameters , ParameterMetadata {
187
+ Name : f .Name ,
188
+ Description : f .Usage ,
189
+ Required : isRequired ,
190
+ Type : f .Value .Type (),
191
+ Default : f .DefValue ,
192
+ })
193
+ })
194
+ return cmdMetadata
195
+ }
196
+
197
+ type ProviderMetadata struct {
198
+ Description string `json:"description"`
199
+ Up CommandMetadata `json:"up"`
200
+ Down CommandMetadata `json:"down"`
201
+ }
202
+
203
+ type CommandMetadata struct {
204
+ Parameters []ParameterMetadata `json:"parameters"`
205
+ }
206
+
207
+ type ParameterMetadata struct {
208
+ Name string `json:"name"`
209
+ Description string `json:"description"`
210
+ Required bool `json:"required"`
211
+ Type string `json:"type"`
212
+ Default string `json:"default,omitempty"`
213
+ }
0 commit comments