diff --git a/internal/config/moduleconfig/module_config.go b/internal/config/moduleconfig/module_config.go index 97c6f2b16..2368c75d8 100644 --- a/internal/config/moduleconfig/module_config.go +++ b/internal/config/moduleconfig/module_config.go @@ -23,6 +23,7 @@ type Parameter struct { Execute string `yaml:"execute,omitempty"` Value string `yaml:"value,omitempty"` Default string `yaml:"default,omitempty"` + Info string `yaml:"info,omitempty"` } type TemplateConfig struct { diff --git a/internal/init/init.go b/internal/init/init.go index 0d4fa5f31..d5884b1bb 100644 --- a/internal/init/init.go +++ b/internal/init/init.go @@ -119,35 +119,35 @@ func promptAllModules(modules map[string]moduleconfig.ModuleConfig, projectCrede // requires the projectName to populate defaults func getProjectNamePrompt() PromptHandler { return PromptHandler{ - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "projectName", Label: "Project Name", Default: "", }, - NoCondition, - NoValidation, + Condition: NoCondition, + Validate: NoValidation, } } func getProjectPrompts(projectName string, modules map[string]moduleconfig.ModuleConfig) map[string]PromptHandler { handlers := map[string]PromptHandler{ "ShouldPushRepositories": { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "ShouldPushRepositories", Label: "Should the created projects be checked into github automatically? (y/n)", Default: "y", }, - NoCondition, - SpecificValueValidation("y", "n"), + Condition: NoCondition, + Validate: SpecificValueValidation("y", "n"), }, "GithubRootOrg": { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "GithubRootOrg", Label: "What's the root of the github org to create repositories in?", Default: "github.com/", }, - KeyMatchCondition("ShouldPushRepositories", "y"), - NoValidation, + Condition: KeyMatchCondition("ShouldPushRepositories", "y"), + Validate: NoValidation, }, } @@ -155,13 +155,13 @@ func getProjectPrompts(projectName string, modules map[string]moduleconfig.Modul label := fmt.Sprintf("What do you want to call the %s project?", moduleName) handlers[moduleName] = PromptHandler{ - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: moduleName, Label: label, Default: module.OutputDir, }, - NoCondition, - NoValidation, + Condition: NoCondition, + Validate: NoValidation, } } @@ -215,63 +215,70 @@ func mapVendorToPrompts(projectCred globalconfig.ProjectCredential, vendor strin case "aws": awsPrompts := []PromptHandler{ { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "use_aws_profile", Label: "Use credentials from existing AWS profiles?", Options: []string{awsPickProfile, awsManualInputCredentials}, }, - customAwsPickProfileCondition, - NoValidation, + Condition: customAwsPickProfileCondition, + Validate: NoValidation, }, { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "aws_profile", Label: "Select AWS Profile", Options: profiles, }, - KeyMatchCondition("use_aws_profile", awsPickProfile), - NoValidation, + Condition: KeyMatchCondition("use_aws_profile", awsPickProfile), + Validate: NoValidation, }, { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "accessKeyId", Label: "AWS Access Key ID", Default: projectCred.AWSResourceConfig.AccessKeyID, + Info: `AWS Access Key ID/Secret: used for provisioning infrastructure in AWS +The token can be generated at https://console.aws.amazon.com/iam/home?#/security_credentials`, }, - CustomCondition(customAwsMustInputCondition), - ValidateAKID, + Condition: CustomCondition(customAwsMustInputCondition), + Validate: ValidateAKID, }, { - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "secretAccessKey", Label: "AWS Secret access key", Default: projectCred.AWSResourceConfig.SecretAccessKey, }, - CustomCondition(customAwsMustInputCondition), - ValidateSAK, + Condition: CustomCondition(customAwsMustInputCondition), + Validate: ValidateSAK, }, } prompts = append(prompts, awsPrompts...) case "github": githubPrompt := PromptHandler{ - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "accessToken", Label: "Github Personal Access Token with access to the above organization", Default: projectCred.GithubResourceConfig.AccessToken, + Info: `Github personal access token: used for creating repositories for your project +Requires the following permissions: [repo::public_repo, admin::orgread:org] +The token can be created at https://github.com/settings/tokens`, }, - NoCondition, - NoValidation, + Condition: NoCondition, + Validate: NoValidation, } prompts = append(prompts, githubPrompt) case "circleci": circleCiPrompt := PromptHandler{ - moduleconfig.Parameter{ + Parameter: moduleconfig.Parameter{ Field: "apiKey", Label: "Circleci api key for CI/CD", Default: projectCred.CircleCiResourceConfig.ApiKey, + Info: `CircleCI api token: used for setting up CI/CD for your project +The token can be created at https://app.circleci.com/settings/user/tokens`, }, - NoCondition, - NoValidation, + Condition: NoCondition, + Validate: NoValidation, } prompts = append(prompts, circleCiPrompt) } diff --git a/internal/init/prompts.go b/internal/init/prompts.go index 534421342..947d60959 100644 --- a/internal/init/prompts.go +++ b/internal/init/prompts.go @@ -14,6 +14,7 @@ import ( "github.com/commitdev/zero/internal/util" "github.com/commitdev/zero/pkg/credentials" "github.com/commitdev/zero/pkg/util/exit" + "github.com/commitdev/zero/pkg/util/flog" "github.com/manifoldco/promptui" "gopkg.in/yaml.v2" ) @@ -91,7 +92,11 @@ func ValidateSAK(input string) error { func (p PromptHandler) GetParam(projectParams map[string]string) string { var err error var result string + if p.Condition(projectParams) { + if p.Parameter.Info != "" { + flog.Guidef(p.Parameter.Info) + } // TODO: figure out scope of projectParams per project // potentially dangerous to have cross module env leaking // so if community module has an `execute: twitter tweet $ENV` @@ -173,9 +178,9 @@ func PromptModuleParams(moduleConfig moduleconfig.ModuleConfig, parameters map[s } promptHandler := PromptHandler{ - promptConfig, - NoCondition, - NoValidation, + Parameter: promptConfig, + Condition: NoCondition, + Validate: NoValidation, } // merging the context of param and credentals // this treats credentialEnvs as throwaway, parameters is shared between modules diff --git a/internal/init/prompts_test.go b/internal/init/prompts_test.go index 434403a09..35c971a8b 100644 --- a/internal/init/prompts_test.go +++ b/internal/init/prompts_test.go @@ -11,6 +11,7 @@ import ( ) func TestGetParam(t *testing.T) { + projectParams := map[string]string{} t.Run("Should execute params without prompt", func(t *testing.T) { param := moduleconfig.Parameter{ diff --git a/pkg/util/flog/log.go b/pkg/util/flog/log.go index 7166026b1..511d8530e 100644 --- a/pkg/util/flog/log.go +++ b/pkg/util/flog/log.go @@ -1,6 +1,7 @@ package flog import ( + "fmt" "log" "github.com/kyokomi/emoji" @@ -12,6 +13,11 @@ func Infof(format string, a ...interface{}) { log.Println(aurora.Cyan(emoji.Sprintf(format, a...))) } +// Infof prints out a timestamp as prefix, Guidef just prints the message +func Guidef(format string, a ...interface{}) { + fmt.Println(aurora.Cyan(emoji.Sprintf(format, a...))) +} + // Successf logs a formatted success message func Successf(format string, a ...interface{}) { log.Println(aurora.Green(emoji.Sprintf(":white_check_mark: "+format, a...)))