forked from openshift/installer
/
userprovided.go
50 lines (42 loc) · 1.58 KB
/
userprovided.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package asset
import (
"io/ioutil"
"os"
"github.com/pkg/errors"
survey "gopkg.in/AlecAivazis/survey.v1"
)
// GenerateUserProvidedAsset queries for input from the user.
func GenerateUserProvidedAsset(inputName string, question *survey.Question, envVarName string) (string, error) {
return generateUserProvidedAsset(inputName, question, envVarName, "")
}
// GenerateUserProvidedAssetForPath queries for input from the user. The input can
// be read from a file specified in an environment variable.
func GenerateUserProvidedAssetForPath(inputName string, question *survey.Question, envVarName, pathEnvVarName string) (string, error) {
return generateUserProvidedAsset(inputName, question, envVarName, pathEnvVarName)
}
func generateUserProvidedAsset(inputName string, question *survey.Question, envVarName, pathEnvVarName string) (response string, err error) {
defer func() {
if err != nil {
err = errors.Wrapf(err, "failed to acquire user-provided input %s", inputName)
}
}()
if value, ok := os.LookupEnv(envVarName); ok {
response = value
} else if path, ok := os.LookupEnv(pathEnvVarName); ok {
value, err := ioutil.ReadFile(path)
if err != nil {
return "", errors.Wrapf(err, "failed to read file from %s", pathEnvVarName)
}
response = string(value)
}
if response == "" {
if err := survey.Ask([]*survey.Question{question}, &response); err != nil {
return "", errors.Wrap(err, "failed to Ask")
}
} else if question.Validate != nil {
if err := question.Validate(response); err != nil {
return "", errors.Wrap(err, "validation failed")
}
}
return response, nil
}