Home

tmpl @main - refs - log -
-
https://git.jolheiser.com/tmpl.git
Template automation
tree log patch
Prompt types (#29) Reviewed-on: https://git.jojodev.com/jolheiser/tmpl/pulls/29
jolheiser <john+jojodev@jolheiser.com>
1 year ago
7 changed files, 78 additions(+), 24 deletions(-)
M config/config.go -> config/config.go
diff --git a/config/config.go b/config/config.go
index fa7eb12661ab072b8b761f2e16c6064bdfa9027b..5ac08fdd79f3facea8ec0fa2ffb996b29d8261f9 100644
--- a/config/config.go
+++ b/config/config.go
@@ -14,13 +14,25 @@ type Config struct {
 	Prompts []Prompt `yaml:"prompts"`
 }
 
+// PromptType is a type of prompt
+type PromptType string
+
+const (
+	PromptTypeInput     PromptType = "input"
+	PromptTypeMultiline PromptType = "multi"
+	PromptTypeEditor    PromptType = "editor"
+	PromptTypeConfirm   PromptType = "confirm"
+	PromptTypeSelect    PromptType = "select"
+)
+
 // Prompt is a tmpl prompt
 type Prompt struct {
-	ID      string   `yaml:"id"`
-	Label   string   `yaml:"label"`
-	Help    string   `yaml:"help"`
-	Default string   `yaml:"default"`
-	Options []string `yaml:"options"`
+	ID      string     `yaml:"id"`
+	Label   string     `yaml:"label"`
+	Help    string     `yaml:"help"`
+	Default string     `yaml:"default"`
+	Options []string   `yaml:"options"`
+	Type    PromptType `yaml:"type"`
 }
 
 // Load loads a tmpl config
M registry/prompt.go -> registry/prompt.go
diff --git a/registry/prompt.go b/registry/prompt.go
index 9f731ebed09f3cebf73d1d4ebe192258ed97280c..73d733d5ef39a8d10a34466dc36cee43fefa9331 100644
--- a/registry/prompt.go
+++ b/registry/prompt.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
+	"strconv"
 	"strings"
 	"text/template"
 
@@ -55,7 +56,8 @@ 		}
 
 		// Otherwise, prompt
 		var p survey.Prompt
-		if len(prompt.Options) > 0 {
+		switch prompt.Type {
+		case config.PromptTypeSelect:
 			opts := make([]string, 0, len(prompt.Options))
 			for idy, opt := range prompt.Options {
 				opts[idy] = os.ExpandEnv(opt)
@@ -65,7 +67,26 @@ 				Message: prompt.Label,
 				Options: opts,
 				Help:    prompt.Help,
 			}
-		} else {
+		case config.PromptTypeConfirm:
+			def, _ := strconv.ParseBool(os.ExpandEnv(prompt.Default))
+			p = &survey.Confirm{
+				Message: prompt.Label,
+				Help:    prompt.Help,
+				Default: def,
+			}
+		case config.PromptTypeMultiline:
+			p = &survey.Multiline{
+				Message: prompt.Label,
+				Default: os.ExpandEnv(prompt.Default),
+				Help:    prompt.Help,
+			}
+		case config.PromptTypeEditor:
+			p = &survey.Editor{
+				Message: prompt.Label,
+				Default: os.ExpandEnv(prompt.Default),
+				Help:    prompt.Help,
+			}
+		default:
 			p = &survey.Input{
 				Message: prompt.Label,
 				Default: os.ExpandEnv(prompt.Default),
@@ -73,12 +94,13 @@ 				Help:    prompt.Help,
 			}
 		}
 
-		var a string
-		if err := survey.AskOne(p, &a); err != nil {
-			return nil, err
+		m := make(map[string]any)
+		if err := survey.AskOne(p, &m); err != nil {
+			return nil, fmt.Errorf("could not complete prompt: %w", err)
 		}
+		a := m[""]
 		prompts[idx].Value = a
-		os.Setenv(fmt.Sprintf("TMPL_PROMPT_%s", envKey), a)
+		os.Setenv(fmt.Sprintf("TMPL_PROMPT_%s", envKey), fmt.Sprint(a))
 	}
 
 	return prompts, nil
@@ -86,7 +108,7 @@ }
 
 type templatePrompt struct {
 	config.Prompt
-	Value string
+	Value any
 }
 
 type templatePrompts []templatePrompt
M registry/registry.go -> registry/registry.go
diff --git a/registry/registry.go b/registry/registry.go
index a0f40aeea8d764ec9d1dce0ee801cdd5b8d40c21..9a9dd0b875c8aacb241609f95eb90741058a2820 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -2,7 +2,6 @@ package registry
 
 import (
 	"errors"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -223,7 +222,7 @@ 	return fi.Close()
 }
 
 func download(cloneURL, branch, dest string) error {
-	tmp, err := ioutil.TempDir(os.TempDir(), "tmpl")
+	tmp, err := os.MkdirTemp(os.TempDir(), "tmpl")
 	if err != nil {
 		return err
 	}
M registry/registry_test.go -> registry/registry_test.go
diff --git a/registry/registry_test.go b/registry/registry_test.go
index eb99ce1b26218e84c6577d9c91d75ef64e7690fd..45c12e4fb4d05ac8fcec3239370e4b31a425ede5 100644
--- a/registry/registry_test.go
+++ b/registry/registry_test.go
@@ -3,7 +3,6 @@
 import (
 	"errors"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"testing"
@@ -67,7 +66,7 @@ }
 
 func setupTemplate() {
 	var err error
-	tmplDir, err = ioutil.TempDir(os.TempDir(), "tmpl-setup")
+	tmplDir, err = os.MkdirTemp(os.TempDir(), "tmpl-setup")
 	if err != nil {
 		panic(err)
 	}
@@ -115,7 +114,7 @@ }
 
 func setupRegistry() {
 	var err error
-	regDir, err = ioutil.TempDir(os.TempDir(), "tmpl-reg")
+	regDir, err = os.MkdirTemp(os.TempDir(), "tmpl-reg")
 	if err != nil {
 		panic(err)
 	}
M registry/template.go -> registry/template.go
diff --git a/registry/template.go b/registry/template.go
index 39ca612f00efd185bee81800f9ad1d104aebab71..239b02c96a6c1f4b5f5a92c776cbbdd57ef097b3 100644
--- a/registry/template.go
+++ b/registry/template.go
@@ -3,7 +3,6 @@
 import (
 	"bytes"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"strings"
@@ -36,7 +35,7 @@ }
 
 // Execute runs the Template and copies to dest
 func (t *Template) Execute(dest string, defaults, overwrite bool) error {
-	tmp, err := ioutil.TempDir(os.TempDir(), "tmpl")
+	tmp, err := os.MkdirTemp(os.TempDir(), "tmpl")
 	if err != nil {
 		return err
 	}
@@ -62,7 +61,7 @@ 		if walkInfo.IsDir() {
 			return nil
 		}
 
-		contents, err := ioutil.ReadFile(walkPath)
+		contents, err := os.ReadFile(walkPath)
 		if err != nil {
 			return err
 		}
M registry/template_test.go -> registry/template_test.go
diff --git a/registry/template_test.go b/registry/template_test.go
index 138d84d12cf94a9e0eaa75cc77e7bdb0463d1b49..c2af0bfc750d294829327d1c80a5be5e7f3e4dec 100644
--- a/registry/template_test.go
+++ b/registry/template_test.go
@@ -1,7 +1,6 @@
 package registry
 
 import (
-	"io/ioutil"
 	"os"
 	"path/filepath"
 	"testing"
@@ -51,7 +50,7 @@ 	assert.NoErr(err) // Should execute template
 
 	// Check contents of file
 	testPath := filepath.Join(destDir, "TEST")
-	contents, err := ioutil.ReadFile(testPath)
+	contents, err := os.ReadFile(testPath)
 	assert.NoErr(err)                        // Should be able to read TEST file
 	assert.Equal(string(contents), tmplGold) // Template should match golden file
 
@@ -66,7 +65,7 @@ 	_, err = os.Lstat(tmplKeep)
 	assert.True(err != nil) // .tmplkeep file should NOT be retained
 
 	// Change file to test non-overwrite
-	err = ioutil.WriteFile(testPath, []byte(tmplNewGold), os.ModePerm)
+	err = os.WriteFile(testPath, []byte(tmplNewGold), os.ModePerm)
 	assert.NoErr(err) // Writing file should succeed
 
 	err = tmpl.Execute(destDir, true, false)
M schema/tmpl.json -> schema/tmpl.json
diff --git a/schema/tmpl.json b/schema/tmpl.json
index a8fdb7f715ab668648744e180ce94485ebb29d00..f88ce462abee12c10457ec8de7a501a812a4739b 100644
--- a/schema/tmpl.json
+++ b/schema/tmpl.json
@@ -43,8 +43,32 @@             "minItems": 1,
             "items": {
               "type": "string"
             }
+          },
+          "type": {
+            "description": "The type of prompt",
+            "type": "string",
+            "enum": ["input", "multi", "select", "confirm", "editor"]
           }
-        }
+        },
+        "anyOf": [
+          {
+            "properties": {
+              "type": {
+                "const": "select"
+              }
+            },
+            "required": ["options"]
+          },
+          {
+            "properties": {
+              "type": {
+                "not": {
+                  "const": "select"
+                }
+              }
+            }
+          }
+        ]
       }
     }
   }