1// Copyright 2017 Google Inc.  All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package getopt
6
7import "fmt"
8
9// An Error is returned by Getopt when it encounters an error.
10type Error struct {
11	ErrorCode        // General reason of failure.
12	Err       error  // The actual error.
13	Parameter string // Parameter passed to option, if any
14	Name      string // Option that cause error, if any
15}
16
17// Error returns the error message, implementing the error interface.
18func (i *Error) Error() string { return i.Err.Error() }
19
20// An ErrorCode indicates what sort of error was encountered.
21type ErrorCode int
22
23const (
24	NoError          = ErrorCode(iota)
25	UnknownOption    // an invalid option was encountered
26	MissingParameter // the options parameter is missing
27	ExtraParameter   // a value was set to a long flag
28	Invalid          // attempt to set an invalid value
29)
30
31func (e ErrorCode) String() string {
32	switch e {
33	case UnknownOption:
34		return "unknow option"
35	case MissingParameter:
36		return "missing argument"
37	case ExtraParameter:
38		return "unxpected value"
39	case Invalid:
40		return "error setting value"
41	}
42	return "unknown error"
43}
44
45// unknownOption returns an Error indicating an unknown option was
46// encountered.
47func unknownOption(name interface{}) *Error {
48	i := &Error{ErrorCode: UnknownOption}
49	switch n := name.(type) {
50	case rune:
51		if n == '-' {
52			i.Name = "-"
53		} else {
54			i.Name = "-" + string(n)
55		}
56	case string:
57		i.Name = "--" + n
58	}
59	i.Err = fmt.Errorf("unknown option: %s", i.Name)
60	return i
61}
62
63// missingArg returns an Error inidicating option o was not passed
64// a required paramter.
65func missingArg(o Option) *Error {
66	return &Error{
67		ErrorCode: MissingParameter,
68		Name:      o.Name(),
69		Err:       fmt.Errorf("missing parameter for %s", o.Name()),
70	}
71}
72
73// extraArg returns an Error inidicating option o was passed the
74// unexpected paramter value.
75func extraArg(o Option, value string) *Error {
76	return &Error{
77		ErrorCode: ExtraParameter,
78		Name:      o.Name(),
79		Parameter: value,
80		Err:       fmt.Errorf("unexpected parameter passed to %s: %q", o.Name(), value),
81	}
82}
83
84// setError returns an Error inidicating option o and the specified
85// error while setting it to value.
86func setError(o Option, value string, err error) *Error {
87	return &Error{
88		ErrorCode: Invalid,
89		Name:      o.Name(),
90		Parameter: value,
91		Err:       err,
92	}
93}
94