mirror of
https://github.com/thegeeklab/drone-plugin-lib.git
synced 2024-11-05 02:40:40 +00:00
feat: add custom StringSliceFlag type that allows escaping (#21)
This commit is contained in:
parent
83dd67c25f
commit
9bf0cbdf85
40
drone/types.go
Normal file
40
drone/types.go
Normal file
@ -0,0 +1,40 @@
|
||||
package drone
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// StringSliceFlag is a flag type which support comma separated values and escaping to not split at unwanted lines
|
||||
type StringSliceFlag struct {
|
||||
slice []string
|
||||
}
|
||||
|
||||
func (s *StringSliceFlag) String() string {
|
||||
return strings.Join(s.slice, " ")
|
||||
}
|
||||
|
||||
func (s *StringSliceFlag) Set(value string) error {
|
||||
s.slice = splitWithEscaping(value, ",", "\\")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *StringSliceFlag) Get() []string {
|
||||
return s.slice
|
||||
}
|
||||
|
||||
func splitWithEscaping(s, separator, escapeString string) []string {
|
||||
if len(s) == 0 {
|
||||
return []string{}
|
||||
}
|
||||
|
||||
a := strings.Split(s, separator)
|
||||
|
||||
for i := len(a) - 2; i >= 0; i-- {
|
||||
if strings.HasSuffix(a[i], escapeString) {
|
||||
a[i] = a[i][:len(a[i])-len(escapeString)] + separator + a[i+1]
|
||||
a = append(a[:i+1], a[i+2:]...)
|
||||
}
|
||||
}
|
||||
|
||||
return a
|
||||
}
|
27
drone/types_test.go
Normal file
27
drone/types_test.go
Normal file
@ -0,0 +1,27 @@
|
||||
package drone
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSplitWithEscaping(t *testing.T) {
|
||||
tests := []struct {
|
||||
Input string
|
||||
Output []string
|
||||
}{
|
||||
{"", []string{}},
|
||||
{"a,b", []string{"a", "b"}},
|
||||
{",,,", []string{"", "", "", ""}},
|
||||
{",a\\,", []string{"", "a,"}},
|
||||
{"a,b\\,c\\\\d,e", []string{"a", "b,c\\\\d", "e"}},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
strings := splitWithEscaping(test.Input, ",", "\\")
|
||||
got, want := strings, test.Output
|
||||
if !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("Got tag %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user