@@ -24,12 +24,12 @@ import (
2424 "sort"
2525 "strings"
2626
27+ "github.com/a8m/envsubst/parse"
28+ "github.com/apache/openserverless-cli/tools"
2729 docopt "github.com/docopt/docopt-go"
2830 "github.com/mitchellh/go-homedir"
2931 "golang.org/x/exp/slices"
3032 "gopkg.in/yaml.v3"
31-
32- envsubst "github.com/nuvolaris/envsubst/cmd/envsubstmain"
3333)
3434
3535type TaskNotFoundErr struct {
@@ -40,18 +40,19 @@ func (e *TaskNotFoundErr) Error() string {
4040 return fmt .Sprintf ("no command named %s found" , e .input )
4141}
4242
43- func help () error {
44- if os .Getenv ("OPS_NO_DOCOPTS" ) == "" && exists ("." , DOCOPTS_TXT ) {
45- os .Args = []string {"envsubst" , "-no-unset" , "-i" , DOCOPTS_TXT }
46- return envsubst .EnvsubstMain ()
43+ func help (helpMessage string ) error {
44+
45+ if helpMessage != "" {
46+ fmt .Println (helpMessage )
47+ return nil
4748 }
49+
4850 // In case of syntax error, Task will return an error
4951 list := "-l"
5052 if os .Getenv ("OPS_NO_DOCOPTS" ) != "" {
5153 list = "--list-all"
5254 }
5355 _ , err := Task ("-t" , OPSFILE , list )
54-
5556 return err
5657}
5758
@@ -152,6 +153,55 @@ func loadSavedArgs() []string {
152153 return res
153154}
154155
156+ // read docpts
157+ // return the doppts and the help text
158+ // expand the environment variables
159+ // if the file is markdown expand the markdown
160+ func readDocOpts () (string , string ) {
161+ if os .Getenv ("OPS_NO_DOCOPTS" ) != "" {
162+ if exists ("." , DOCOPTS_TXT ) {
163+ fmt .Printf ("Warning: ignoring %s - you have to provide all the options.\n " , DOCOPTS_TXT )
164+ }
165+ if exists ("." , DOCOPTS_MD ) {
166+ fmt .Printf ("Warning: ignoring %s - you have to provide all the options.\n " , DOCOPTS_MD )
167+ }
168+ return "" , ""
169+ }
170+ if exists ("." , DOCOPTS_MD ) {
171+ text := readfile (DOCOPTS_MD )
172+
173+ // parse embedded variables
174+ restrictions := & parse.Restrictions {false , false , true }
175+ result , err := (& parse.Parser {Name : "string" , Env : os .Environ (), Restrict : restrictions , Mode : parse .AllErrors }).Parse (text )
176+ if err != nil {
177+ return "" , err .Error ()
178+ }
179+ // convert to markdown
180+ help := tools .MarkdownToText (result )
181+ // extract the embedded usage
182+ opts := tools .ExtractUsage (result )
183+
184+ // warn if there is a docopts.txt
185+ if exists ("." , DOCOPTS_TXT ) {
186+ help = fmt .Sprintf ("%s\n Warning: both %s and %s are present, %s ignored." ,
187+ help , DOCOPTS_TXT , DOCOPTS_MD , DOCOPTS_TXT )
188+ }
189+ return opts , help
190+ }
191+
192+ if exists ("." , DOCOPTS_TXT ) {
193+ text := readfile (DOCOPTS_TXT )
194+ restrictions := & parse.Restrictions {false , false , true }
195+ help , err := (& parse.Parser {Name : "string" , Env : os .Environ (), Restrict : restrictions , Mode : parse .AllErrors }).Parse (text )
196+ if err != nil {
197+ help = err .Error ()
198+ }
199+ return help , help
200+ }
201+
202+ return "" , ""
203+ }
204+
155205// Ops parses args moving into the folder corresponding to args
156206// then parses them with docopts and invokes the task
157207func Ops (base string , args []string ) error {
@@ -209,9 +259,12 @@ func Ops(base string, args []string) error {
209259 }
210260 }
211261
262+ // read docopts and help text
263+ opts , helpMessage := readDocOpts ()
264+
265+ // print help
212266 if len (rest ) == 0 || rest [0 ] == "help" {
213- trace ("print help" )
214- err := help ()
267+ err := help (helpMessage )
215268 if ! isSubCmd {
216269 fmt .Println ()
217270 return printPluginsHelp ()
@@ -222,18 +275,22 @@ func Ops(base string, args []string) error {
222275 // load saved args
223276 savedArgs := loadSavedArgs ()
224277
225- // parsed args
226- if os .Getenv ("OPS_NO_DOCOPTS" ) == "" && exists ("." , DOCOPTS_TXT ) {
278+ // parse options if an opts file is available
279+ trace ("DOCOPTS:" , opts )
280+ if opts != "" {
227281 debug ("PREPARSE:" , rest )
228- opts := readfile ( DOCOPTS_TXT )
229- trace ( "DOCOPTS: size=" , len ( opts ))
282+
283+ // parse args
230284 parsedArgs := parseArgs (opts , rest )
231285 trace ("DOCOPTS: parsedargs=" , parsedArgs )
286+
287+ // append -t optfile.yml to the Task cli
232288 prefix := []string {"-t" , OPSFILE }
233289 if len (rest ) > 0 && rest [0 ][0 ] != '-' {
234290 prefix = append (prefix , rest [0 ])
235291 }
236292
293+ // parse args
237294 parsedArgs = append (savedArgs , parsedArgs ... )
238295 parsedArgs = append (prefix , parsedArgs ... )
239296 extra := os .Getenv ("EXTRA" )
0 commit comments