podman

Форк
0
128 строк · 2.3 Кб
1
package cmdline
2

3
import (
4
	"fmt"
5
	"strings"
6

7
	"github.com/crc-org/vfkit/pkg/util"
8
)
9

10
// -- stringSlice Value
11
type stringSliceValue struct {
12
	value   []string
13
	changed bool
14
}
15

16
type strvBuilder struct {
17
	strBuilder strings.Builder
18
	strv       []string
19
	err        error
20
}
21

22
func (builder *strvBuilder) String() string {
23
	str := builder.strBuilder.String()
24
	// "a","b" is parsed as { "a", "b" } to match pflag StringSlice behaviour
25
	return util.TrimQuotes(str)
26
}
27

28
func (builder *strvBuilder) Next() {
29
	str := builder.String()
30
	builder.strv = append(builder.strv, str)
31
	builder.strBuilder.Reset()
32
}
33

34
func (builder *strvBuilder) WriteRune(r rune) {
35
	if builder.err != nil {
36
		return
37
	}
38
	_, err := builder.strBuilder.WriteRune(r)
39
	if err != nil {
40
		builder.err = err
41
	}
42
}
43

44
func (builder *strvBuilder) End() ([]string, error) {
45
	if builder.err != nil {
46
		return nil, builder.err
47
	}
48

49
	lastStr := builder.String()
50
	if len(builder.strv) != 0 || len(lastStr) != 0 {
51
		builder.strv = append(builder.strv, lastStr)
52
	}
53

54
	return builder.strv, nil
55
}
56

57
func parseString(str string) ([]string, error) {
58
	withinQuotes := false
59

60
	//  trim spaces from str
61
	builder := strvBuilder{}
62
	for _, c := range str {
63
		if withinQuotes {
64
			if c == '"' {
65
				withinQuotes = false
66
			}
67
			builder.WriteRune(c)
68
			continue
69
		}
70
		if withinQuotes {
71
			return nil, fmt.Errorf("Coding error in arg parsing")
72
		}
73
		switch c {
74
		case ',':
75
			builder.Next()
76
		case '"':
77
			withinQuotes = true
78
			fallthrough
79
		// FIXME: can we get ' ' at this point??
80
		default:
81
			builder.WriteRune(c)
82
		}
83
	}
84
	if withinQuotes {
85
		return nil, fmt.Errorf("Mismatched \"")
86
	}
87

88
	return builder.End()
89
}
90

91
func (s *stringSliceValue) Set(val string) error {
92
	v, err := parseString(val)
93
	if err != nil {
94
		return err
95
	}
96
	if !s.changed {
97
		s.value = v
98
	} else {
99
		s.value = append(s.value, v...)
100
	}
101
	s.changed = true
102
	return nil
103
}
104

105
func (s *stringSliceValue) Type() string {
106
	return "stringSlice"
107
}
108

109
func (s *stringSliceValue) String() string {
110
	if s == nil || s.value == nil {
111
		return "[]"
112
	}
113
	return "[" + strings.Join(s.value, ",") + "]"
114
}
115

116
func (s *stringSliceValue) Append(val string) error {
117
	s.value = append(s.value, val)
118
	return nil
119
}
120

121
func (s *stringSliceValue) Replace(val []string) error {
122
	s.value = val
123
	return nil
124
}
125

126
func (s *stringSliceValue) GetSlice() []string {
127
	return s.value
128
}
129

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.