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  }