Skip to content

Commit 8c23082

Browse files
authored
select language when none detected (#483)
1 parent 6b87369 commit 8c23082

1 file changed

Lines changed: 45 additions & 5 deletions

File tree

cmd/create.go

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,22 @@ import (
77
"os"
88
"strings"
99

10-
"gopkg.in/yaml.v3"
11-
12-
"github.com/Azure/draft/pkg/handlers"
13-
"github.com/Azure/draft/pkg/reporeader"
14-
"github.com/Azure/draft/pkg/reporeader/readers"
1510
"github.com/manifoldco/promptui"
1611
log "github.com/sirupsen/logrus"
1712
"github.com/spf13/cobra"
13+
"gopkg.in/yaml.v3"
1814

1915
"github.com/Azure/draft/pkg/config"
2016
dryrunpkg "github.com/Azure/draft/pkg/dryrun"
2117
"github.com/Azure/draft/pkg/filematches"
18+
"github.com/Azure/draft/pkg/handlers"
2219
"github.com/Azure/draft/pkg/linguist"
2320
"github.com/Azure/draft/pkg/prompts"
21+
"github.com/Azure/draft/pkg/reporeader"
22+
"github.com/Azure/draft/pkg/reporeader/readers"
2423
"github.com/Azure/draft/pkg/templatewriter"
2524
"github.com/Azure/draft/pkg/templatewriter/writers"
25+
"github.com/Azure/draft/template"
2626
)
2727

2828
// ErrNoLanguageDetected is raised when `draft create` does not detect source
@@ -37,6 +37,22 @@ const TWO_SPACES = " "
3737
const emptyDefaultFlagValue = ""
3838
const currentDirDefaultFlagValue = "."
3939

40+
const DOCKERFILES_DIR = "dockerfiles"
41+
42+
func listSupportedLanguages() ([]string, error) {
43+
var supportedLanguages []string
44+
entries, err := template.Templates.ReadDir(DOCKERFILES_DIR)
45+
if err != nil {
46+
return supportedLanguages, fmt.Errorf("reading supported languages from embedded fs: %w", err)
47+
}
48+
for _, d := range entries {
49+
if d.IsDir() {
50+
supportedLanguages = append(supportedLanguages, d.Name())
51+
}
52+
}
53+
return supportedLanguages, nil
54+
}
55+
4056
type createCmd struct {
4157
lang string
4258
dest string
@@ -152,6 +168,11 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) {
152168
hasGoMod := false
153169
var langs []*linguist.Language
154170
var err error
171+
supportedLanguages, err := listSupportedLanguages()
172+
if err != nil {
173+
log.Errorf("loading supported languages: %s", err.Error())
174+
}
175+
log.Debugf("loaded supported languages: %v", supportedLanguages)
155176
if cc.createConfig.LanguageType == "" {
156177
if cc.lang != "" {
157178
cc.createConfig.LanguageType = cc.lang
@@ -162,6 +183,12 @@ func (cc *createCmd) detectLanguage() (*handlers.Template, string, error) {
162183
if err != nil {
163184
return nil, "", fmt.Errorf("there was an error detecting the language: %s", err)
164185
}
186+
if len(langs) == 0 {
187+
langs, err = promptLanguageSelection(supportedLanguages)
188+
if err != nil {
189+
return nil, "", fmt.Errorf("prompting for language: %w", err)
190+
}
191+
}
165192
for _, lang := range langs {
166193
log.Debugf("%s:\t%f (%s)", lang.Language, lang.Percent, lang.Color)
167194
// For now let's check here for weird stuff like go module support
@@ -462,3 +489,16 @@ func validateConfigInputsToPrompts(draftConfig *config.DraftConfig, provided []U
462489

463490
return nil
464491
}
492+
493+
func promptLanguageSelection(supportedLanguages []string) ([]*linguist.Language, error) {
494+
selection := &promptui.Select{
495+
Label: "Unable to detect a supported language, please select one:",
496+
Items: supportedLanguages,
497+
}
498+
_, selectResponse, err := selection.Run()
499+
if err != nil {
500+
return nil, fmt.Errorf("manually selecting language: %w", err)
501+
}
502+
langs := []*linguist.Language{{Language: selectResponse}}
503+
return langs, nil
504+
}

0 commit comments

Comments
 (0)