Skip to content

Commit

Permalink
Support using env vars to set input values
Browse files Browse the repository at this point in the history
evilmarty committed Jun 8, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent b9b19a3 commit ca5364d
Showing 3 changed files with 51 additions and 10 deletions.
29 changes: 21 additions & 8 deletions command_set.go
Original file line number Diff line number Diff line change
@@ -8,7 +8,10 @@ import (
"strings"
)

var DefaultShell = []string{"/bin/sh"}
var (
DefaultShell = []string{"/bin/sh"}
EnvVarPrefix = "ILC_INPUT_"
)

type CommandSet struct {
Config Config
@@ -143,14 +146,24 @@ func (cs CommandSet) AskInputs(values *map[string]any) error {
return nil
}

func (cs CommandSet) Values() (map[string]any, error) {
var err error
values := make(map[string]any)
err = cs.ParseArgs(&values)
if err == nil {
err = cs.AskInputs(&values)
func (cs CommandSet) ParseEnv(values *map[string]any, environ []string) {
inputs := cs.Inputs()
inputsMap := make(map[string]*ConfigInput, len(inputs))
for _, input := range inputs {
inputsMap[input.Name] = &input
}
for _, item := range environ {
if !strings.HasPrefix(item, EnvVarPrefix) {
continue
}
entry := strings.SplitN(item, "=", 2)
name := strings.TrimPrefix(entry[0], EnvVarPrefix)
if input, ok := inputsMap[name]; !ok {
continue
} else {
(*values)[input.Name] = entry[1]
}
}
return values, err
}

func (cs CommandSet) Cmd(data map[string]any, moreEnviron []string) (*exec.Cmd, error) {
24 changes: 24 additions & 0 deletions command_set_test.go
Original file line number Diff line number Diff line change
@@ -400,6 +400,30 @@ func TestCommandSetParseArgs_Help(t *testing.T) {
assertDeepEqual(t, flag.ErrHelp, actual, "CommandSet.ParseArgs() did not acknowledge help")
}

func TestCommandSetParseEnv(t *testing.T) {
cs := CommandSet{
Commands: []ConfigCommand{
{
Inputs: ConfigInputs{
ConfigInput{Name: "A", DefaultValue: ""},
ConfigInput{Name: "B", DefaultValue: "b"},
},
},
{
Inputs: ConfigInputs{
ConfigInput{Name: "C", DefaultValue: "c"},
},
},
},
Args: []string{"-help"},
}
env := []string{"ILC_INPUT_A=a=a", "ILC_INPUT_C=", "ILC_INPUT_D=dd"}
expected := map[string]any{"A": "a=a", "C": ""}
actual := make(map[string]any)
cs.ParseEnv(&actual, env)
assertDeepEqual(t, expected, actual, "CommandSet.ParseEnv() returned unexpected results")
}

func TestNewCommandSet_PreselectedFromArgs(t *testing.T) {
config := Config{
Commands: ConfigCommands{
8 changes: 6 additions & 2 deletions run.go
Original file line number Diff line number Diff line change
@@ -28,8 +28,12 @@ func (r *Runner) Run() error {
if err != nil {
return fmt.Errorf("failed to select command: %v", err)
}
values, err := cs.Values()
if err != nil {
values := make(map[string]any)
cs.ParseEnv(&values, r.Env)
if err = cs.ParseArgs(&values); err != nil {
return fmt.Errorf("failed parsing arguments: %v", err)
}
if err = cs.AskInputs(&values); err != nil {
return fmt.Errorf("failed getting input values: %v", err)
}
cmd, err := cs.Cmd(values, r.Env)

0 comments on commit ca5364d

Please sign in to comment.