Skip to content
Snippets Groups Projects
Verified Commit c570055c authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

feat: add multiple string values

parent 93f48c32
No related branches found
No related tags found
No related merge requests found
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<enabledExtensions>
<entry key="MermaidLanguageExtension" value="false" />
<entry key="PlantUMLLanguageExtension" value="true" />
</enabledExtensions>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/xflags.iml" filepath="$PROJECT_DIR$/.idea/xflags.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
......@@ -80,10 +80,9 @@ func callCmdFunctions[C any](settings *Settings[C], commands []*cmd[C]) bool {
if settings.hint == "" {
settings.hint = fmt.Sprintf("Did you mean: %v?", strings.Join(availableCommands, ", "))
}
settings.errors = append(settings.errors, MissingCommandError)
}
settings.errors = append(settings.errors, MissingCommandError)
return false
}
......
// Copyright 2023 schukai GmbH
// SPDX-License-Identifier: AGPL-3.0
package xflags
func (s *Settings[C]) SetHint(hint string) *Settings[C] {
......
......@@ -7,6 +7,7 @@ import (
"flag"
"gitlab.schukai.com/oss/libraries/go/utilities/pathfinder"
"reflect"
"strconv"
"strings"
)
......@@ -37,7 +38,7 @@ func (s *Settings[C]) assignValues(c cmd[C]) {
flgs.Visit(func(f *flag.Flag) {
name := f.Name
value := f.Value.String()
stringValue := f.Value.String()
k, ok := c.tagMapping[name]
if !ok {
......@@ -55,10 +56,48 @@ func (s *Settings[C]) assignValues(c cmd[C]) {
}
if q == nil {
q = reflect.New(reflect.TypeOf(q).Elem()).Interface()
s.errors = append(s.errors, newUnknownFlagError(name))
return
}
err = pathfinder.SetValue(&s.definitions, p, value)
typeOf := reflect.TypeOf(q)
switch typeOf.Kind() {
case reflect.String:
err = pathfinder.SetValue(&s.definitions, p, stringValue)
case reflect.Int:
intVar, err := strconv.Atoi(stringValue)
if err != nil {
s.errors = append(s.errors, err)
return
}
err = pathfinder.SetValue(&s.definitions, p, intVar)
case reflect.Bool:
boolVar, err := strconv.ParseBool(stringValue)
if err != nil {
s.errors = append(s.errors, err)
return
}
err = pathfinder.SetValue(&s.definitions, p, boolVar)
case reflect.Slice:
switch typeOf.Elem().Kind() {
case reflect.String:
qs := q.(StringFlags)
stringSliceValue := f.Value.(*StringFlags)
for _, v := range *stringSliceValue {
err = qs.Set(v)
if err != nil {
s.errors = append(s.errors, err)
return
}
}
err = pathfinder.SetValue(&s.definitions, p, qs)
default:
err = pathfinder.SetValue(&s.definitions, p, stringValue)
}
}
if err != nil {
s.errors = append(s.errors, err)
......@@ -66,7 +105,7 @@ func (s *Settings[C]) assignValues(c cmd[C]) {
if c.proxyMapping[k] != "" {
p = c.proxyMapping[k]
s.mapping[p] = value
s.mapping[p] = stringValue
}
})
......
// Copyright 2022 schukai GmbH
// SPDX-License-Identifier: AGPL-3.0
package xflags
import (
"github.com/stretchr/testify/assert"
"testing"
)
type ParseMultiTestDefinition struct {
Values StringFlags `short:"x" long:"yyy" description:"Host to bind to" default:"localhost"`
}
func TestMultiParseIt(t *testing.T) {
setting := New("test", ParseMultiTestDefinition{})
setting.Parse([]string{"-x", "a1", "-x", "a2", "--yyy", "a3"})
setting.Execute()
if setting.HasErrors() {
for _, err := range setting.Errors() {
t.Log(err)
}
}
assert.False(t, setting.HasErrors())
assert.Equal(t, StringFlags{"a1", "a2", "a3"}, setting.definitions.Values)
}
// Copyright 2023 schukai GmbH
// SPDX-License-Identifier: AGPL-3.0
package xflags
import (
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment