github.com/WindomZ/go-commander@v1.2.2/program.go (about) 1 package commander 2 3 import ( 4 "fmt" 5 "os" 6 ) 7 8 type GoCommander interface { 9 Commander 10 Context 11 } 12 13 var Program GoCommander = newProgram() 14 15 type _Program struct { 16 _Command 17 _Context 18 Format Formatter 19 Exec Execute 20 initial bool 21 version string // version if root command 22 errFunc func(error) 23 } 24 25 func newProgram() *_Program { 26 return &_Program{ 27 _Command: *newCommand(true), 28 Format: Format, 29 Exec: Exec, 30 errFunc: func(err error) { 31 fmt.Println(err.Error()) 32 }, 33 } 34 } 35 36 func (p *_Program) init() *_Program { 37 if p.initial { 38 return p 39 } 40 p.initial = true 41 p._Command.init() 42 p.Command("-h --help", "output usage information", func() _Result { 43 p.ShowHelpMessage() 44 return resultBreak() 45 }) 46 p.Command("-v --version", "output the version number", func() _Result { 47 p.ShowVersion() 48 return resultBreak() 49 }) 50 return p 51 } 52 53 func (p *_Program) Version(ver string) Commander { 54 p._Command.Version(ver) 55 p.version = ver 56 return p 57 } 58 59 func (p _Program) ShowVersion() string { 60 fmt.Println(p.version) 61 return p.version 62 } 63 64 func (p *_Program) HelpMessage() string { 65 return p.init()._Command.HelpMessage() 66 } 67 68 func (p _Program) ShowHelpMessage() string { 69 s := p.HelpMessage() 70 fmt.Println(s) 71 return s 72 } 73 74 func (p *_Program) Parse(args ...[]string) (Context, error) { 75 var argv []string = nil 76 if len(args) != 0 { 77 argv = args[0] 78 } 79 if argv == nil && len(os.Args) > 1 { 80 argv = os.Args 81 } 82 if argv == nil || len(argv) == 0 { 83 argv = []string{"", "-h"} 84 } 85 d, err := Parse(p.HelpMessage(), argv, false, "", false, false) 86 if err != nil { 87 return nil, err 88 } 89 p._Context = *newContext(argv, d) 90 if r := p.run(&p._Context); r != nil { 91 if r.Break() { 92 if p.errFunc != nil && r.Error() != nil { 93 p.errFunc(r.Error()) 94 } 95 return &p._Context, r.Error() 96 } 97 } 98 return &p._Context, nil 99 } 100 101 func (p *_Program) ErrorHandling(f func(error)) Commander { 102 p.errFunc = f 103 return p 104 }