@@ -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 = " "
3737const emptyDefaultFlagValue = ""
3838const 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+
4056type 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