package pflag

// -- stringArray Value
type stringArrayValue struct {
	value   *[]string
	changed bool
}

func newStringArrayValue( []string,  *[]string) *stringArrayValue {
	 := new(stringArrayValue)
	.value = 
	*.value = 
	return 
}

func ( *stringArrayValue) ( string) error {
	if !.changed {
		*.value = []string{}
		.changed = true
	} else {
		*.value = append(*.value, )
	}
	return nil
}

func ( *stringArrayValue) ( string) error {
	*.value = append(*.value, )
	return nil
}

func ( *stringArrayValue) ( []string) error {
	 := make([]string, len())
	for ,  := range  {
		[] = 
	}
	*.value = 
	return nil
}

func ( *stringArrayValue) () []string {
	 := make([]string, len(*.value))
	for ,  := range *.value {
		[] = 
	}
	return 
}

func ( *stringArrayValue) () string {
	return "stringArray"
}

func ( *stringArrayValue) () string {
	,  := writeAsCSV(*.value)
	return "[" +  + "]"
}

func stringArrayConv( string) (interface{}, error) {
	 = [1 : len()-1]
	// An empty string would cause a array with one (empty) string
	if len() == 0 {
		return []string{}, nil
	}
	return readAsCSV()
}

// GetStringArray return the []string value of a flag with the given name
func ( *FlagSet) ( string) ([]string, error) {
	,  := .getFlagType(, "stringArray", stringArrayConv)
	if  != nil {
		return []string{}, 
	}
	return .([]string), nil
}

// StringArrayVar defines a string flag with specified name, default value, and usage string.
// The argument p points to a []string variable in which to store the values of the multiple flags.
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
func ( *FlagSet) ( *[]string,  string,  []string,  string) {
	.VarP(newStringArrayValue(, ), , "", )
}

// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
func ( *FlagSet) ( *[]string, ,  string,  []string,  string) {
	.VarP(newStringArrayValue(, ), , , )
}

// StringArrayVar defines a string flag with specified name, default value, and usage string.
// The argument p points to a []string variable in which to store the value of the flag.
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
func ( *[]string,  string,  []string,  string) {
	CommandLine.VarP(newStringArrayValue(, ), , "", )
}

// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
func ( *[]string, ,  string,  []string,  string) {
	CommandLine.VarP(newStringArrayValue(, ), , , )
}

// StringArray defines a string flag with specified name, default value, and usage string.
// The return value is the address of a []string variable that stores the value of the flag.
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
func ( *FlagSet) ( string,  []string,  string) *[]string {
	 := []string{}
	.StringArrayVarP(&, , "", , )
	return &
}

// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
func ( *FlagSet) (,  string,  []string,  string) *[]string {
	 := []string{}
	.StringArrayVarP(&, , , , )
	return &
}

// StringArray defines a string flag with specified name, default value, and usage string.
// The return value is the address of a []string variable that stores the value of the flag.
// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
func ( string,  []string,  string) *[]string {
	return CommandLine.StringArrayP(, "", , )
}

// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
func (,  string,  []string,  string) *[]string {
	return CommandLine.StringArrayP(, , , )
}