@@ -25,59 +25,77 @@ func main() {
2525
2626func aepcli (args []string ) error {
2727 var logLevel string
28- var fileOrAlias string
28+ var fileAliasOrCore string
2929 var additionalArgs []string
30+ var headers []string
31+ var pathPrefix string
32+ var serverURL string
33+ var configFileVar string
3034 var s * service.Service
3135
3236 rootCmd := & cobra.Command {
3337 Use : "aepcli [host or api alias] [resource or --help]" ,
3438 Args : cobra .MinimumNArgs (1 ),
3539 Run : func (cmd * cobra.Command , args []string ) {
36- fileOrAlias = args [0 ]
40+ fileAliasOrCore = args [0 ]
3741 if len (args ) > 1 {
3842 additionalArgs = args [1 :]
3943 }
4044 },
4145 }
4246
43- var rawHeaders []string
44- var pathPrefix string
45- var serverURL string
47+ configFile , err := config .DefaultConfigFile ()
48+ if err != nil {
49+ return fmt .Errorf ("unable to get default config file: %w" , err )
50+ }
51+
4652 rootCmd .Flags ().SetInterspersed (false ) // allow sub parsers to parse subsequent flags after the resource
47- rootCmd .PersistentFlags ().StringArrayVar (& rawHeaders , "header" , []string {}, "Specify headers in the format key=value" )
53+ rootCmd .PersistentFlags ().StringArrayVar (& headers , "header" , []string {}, "Specify headers in the format key=value" )
4854 rootCmd .PersistentFlags ().StringVar (& logLevel , "log-level" , "info" , "Set the logging level (debug, info, warn, error)" )
4955 rootCmd .PersistentFlags ().StringVar (& pathPrefix , "path-prefix" , "" , "Specify a path prefix that is prepended to all paths in the openapi schema. This will strip them when evaluating the resource hierarchy paths." )
5056 rootCmd .PersistentFlags ().StringVar (& serverURL , "server-url" , "" , "Specify a URL to use for the server. If not specified, the first server URL in the OpenAPI definition will be used." )
51-
57+ rootCmd . PersistentFlags (). StringVar ( & configFileVar , "config" , "" , "Path to config file" )
5258 rootCmd .SetArgs (args )
59+
5360 if err := rootCmd .Execute (); err != nil {
5461 return err
5562 }
5663
64+ if configFileVar != "" {
65+ configFile = configFileVar
66+ }
67+
5768 if err := setLogLevel (logLevel ); err != nil {
5869 return fmt .Errorf ("unable to set log level: %w" , err )
5970 }
6071
61- c , err := config .ReadConfig ( )
72+ c , err := config .ReadConfigFromFile ( configFile )
6273 if err != nil {
6374 return fmt .Errorf ("unable to read config: %v" , err )
6475 }
6576
66- if api , ok := c .APIs [fileOrAlias ]; ok {
77+ if fileAliasOrCore == "core" {
78+ return handleCoreCommand (additionalArgs , configFile )
79+ }
80+
81+ if api , ok := c .APIs [fileAliasOrCore ]; ok {
6782 cd , err := config .ConfigDir ()
6883 if err != nil {
69- fmt .Println (err )
70- os .Exit (1 )
84+ return fmt .Errorf ("unable to get config directory: %w" , err )
85+ }
86+ if filepath .IsAbs (api .OpenAPIPath ) || strings .HasPrefix (api .OpenAPIPath , "http" ) {
87+ fileAliasOrCore = api .OpenAPIPath
88+ } else {
89+ fileAliasOrCore = filepath .Join (cd , api .OpenAPIPath )
7190 }
72- fileOrAlias = filepath .Join (cd , api .OpenAPIPath )
7391 if pathPrefix == "" {
7492 pathPrefix = api .PathPrefix
7593 }
76- rawHeaders = append (rawHeaders , api .Headers ... )
94+ headers = append (headers , api .Headers ... )
7795 serverURL = api .ServerURL
7896 }
7997
80- openapi , err := openapi .FetchOpenAPI (fileOrAlias )
98+ openapi , err := openapi .FetchOpenAPI (fileAliasOrCore )
8199 if err != nil {
82100 return fmt .Errorf ("unable to fetch openapi: %w" , err )
83101 }
@@ -86,12 +104,12 @@ func aepcli(args []string) error {
86104 return fmt .Errorf ("unable to get service definition: %w" , err )
87105 }
88106
89- headers , err := parseHeaders (rawHeaders )
107+ headersMap , err := parseHeaders (headers )
90108 if err != nil {
91109 return fmt .Errorf ("unable to parse headers: %w" , err )
92110 }
93111
94- s = service .NewService (* serviceDefinition , headers )
112+ s = service .NewService (* serviceDefinition , headersMap )
95113
96114 result , err := s .ExecuteCommand (additionalArgs )
97115 if err != nil {
@@ -130,3 +148,111 @@ func setLogLevel(levelAsString string) error {
130148 slog .SetLogLoggerLevel (level )
131149 return nil
132150}
151+
152+ func handleCoreCommand (additionalArgs []string , configFile string ) error {
153+ var openAPIPath string
154+ var overwrite bool
155+ var api config.API
156+ var serverURL string
157+ var headers []string
158+ var pathPrefix string
159+
160+ coreCmd := & cobra.Command {
161+ Use : "core" ,
162+ Short : "Core API management commands" ,
163+ }
164+
165+ configCmd := & cobra.Command {
166+ Use : "config" ,
167+ Short : "Manage core API configurations" ,
168+ }
169+
170+ addCmd := & cobra.Command {
171+ Use : "add [name]" ,
172+ Short : "Add a new core API configuration" ,
173+ Args : cobra .ExactArgs (1 ),
174+ Run : func (cmd * cobra.Command , args []string ) {
175+ api = config.API {
176+ Name : args [0 ],
177+ OpenAPIPath : openAPIPath ,
178+ ServerURL : serverURL ,
179+ Headers : headers ,
180+ PathPrefix : pathPrefix ,
181+ }
182+ if err := config .WriteAPIWithName (configFile , api , overwrite ); err != nil {
183+ fmt .Printf ("Error writing API config: %v\n " , err )
184+ os .Exit (1 )
185+ }
186+ fmt .Printf ("Core API configuration '%s' added successfully\n " , args [0 ])
187+ },
188+ }
189+
190+ addCmd .Flags ().StringVar (& openAPIPath , "openapi-path" , "" , "Path to OpenAPI specification file" )
191+ addCmd .Flags ().StringArrayVar (& headers , "header" , []string {}, "Headers in format key=value" )
192+ addCmd .Flags ().StringVar (& serverURL , "server-url" , "" , "Server URL" )
193+ addCmd .Flags ().StringVar (& pathPrefix , "path-prefix" , "" , "Path prefix" )
194+ addCmd .Flags ().BoolVar (& overwrite , "overwrite" , false , "Overwrite existing configuration" )
195+
196+ readCmd := & cobra.Command {
197+ Use : "get [name]" ,
198+ Short : "Get an API configuration" ,
199+ Args : cobra .ExactArgs (1 ),
200+ Run : func (cmd * cobra.Command , args []string ) {
201+ cfg , err := config .ReadConfigFromFile (configFile )
202+ if err != nil {
203+ fmt .Printf ("Error reading config file: %v\n " , err )
204+ os .Exit (1 )
205+ }
206+
207+ api , exists := cfg .APIs [args [0 ]]
208+ if ! exists {
209+ fmt .Printf ("No API configuration found with name '%s'\n " , args [0 ])
210+ os .Exit (1 )
211+ }
212+
213+ fmt .Printf ("Name: %s\n " , api .Name )
214+ fmt .Printf ("OpenAPI Path: %s\n " , api .OpenAPIPath )
215+ fmt .Printf ("Server URL: %s\n " , api .ServerURL )
216+ fmt .Printf ("Headers: %v\n " , api .Headers )
217+ fmt .Printf ("Path Prefix: %s\n " , api .PathPrefix )
218+ },
219+ }
220+
221+ listCmd := & cobra.Command {
222+ Use : "list" ,
223+ Short : "List all API configurations" ,
224+ Args : cobra .NoArgs ,
225+ Run : func (cmd * cobra.Command , args []string ) {
226+ apis , err := config .ListAPIs (configFile )
227+ if err != nil {
228+ fmt .Printf ("Error listing APIs: %v\n " , err )
229+ os .Exit (1 )
230+ }
231+
232+ if len (apis ) == 0 {
233+ fmt .Println ("No API configurations found" )
234+ return
235+ }
236+
237+ for _ , api := range apis {
238+ fmt .Printf ("Name: %s\n " , api .Name )
239+ fmt .Printf ("OpenAPI Path: %s\n " , api .OpenAPIPath )
240+ fmt .Printf ("Server URL: %s\n " , api .ServerURL )
241+ fmt .Printf ("Headers: %v\n " , api .Headers )
242+ fmt .Printf ("Path Prefix: %s\n " , api .PathPrefix )
243+ fmt .Println ()
244+ }
245+ },
246+ }
247+
248+ configCmd .AddCommand (addCmd )
249+ configCmd .AddCommand (readCmd )
250+ configCmd .AddCommand (listCmd )
251+ coreCmd .AddCommand (configCmd )
252+
253+ coreCmd .SetArgs (additionalArgs )
254+ if err := coreCmd .Execute (); err != nil {
255+ return fmt .Errorf ("error executing core command: %v" , err )
256+ }
257+ return nil
258+ }
0 commit comments