github.com/rohankumardubey/go-enry@v1.7.3/internal/code-generator/generator/extensions.go (about) 1 package generator 2 3 import ( 4 "bytes" 5 "io" 6 "io/ioutil" 7 "strings" 8 "text/template" 9 10 yaml "gopkg.in/yaml.v2" 11 ) 12 13 type extensionsInfo struct { 14 LanguagesByExtension map[string][]string 15 ExtensionsByLanguage map[string][]string 16 } 17 18 // Extensions reads from fileToParse and builds source file from tmplPath. It complies with type File signature. 19 func Extensions(fileToParse, samplesDir, outPath, tmplPath, tmplName, commit string) error { 20 data, err := ioutil.ReadFile(fileToParse) 21 if err != nil { 22 return err 23 } 24 25 languages := make(map[string]*languageInfo) 26 if err := yaml.Unmarshal(data, &languages); err != nil { 27 return err 28 } 29 30 extensionsToLower(languages) 31 extInfo := &extensionsInfo{} 32 orderedKeyList := getAlphabeticalOrderedKeys(languages) 33 extInfo.LanguagesByExtension = buildExtensionLanguageMap(languages, orderedKeyList) 34 extInfo.ExtensionsByLanguage = buildLanguageExtensionsMap(languages) 35 36 buf := &bytes.Buffer{} 37 if err := executeExtensionsTemplate(buf, extInfo, tmplPath, tmplName, commit); err != nil { 38 return err 39 } 40 41 return formatedWrite(outPath, buf.Bytes()) 42 } 43 44 func extensionsToLower(languages map[string]*languageInfo) { 45 for _, info := range languages { 46 info.Extensions = stringSliceToLower(info.Extensions) 47 } 48 } 49 50 func stringSliceToLower(slice []string) []string { 51 toLower := make([]string, 0, len(slice)) 52 for _, s := range slice { 53 toLower = append(toLower, strings.ToLower(s)) 54 } 55 56 return toLower 57 } 58 59 func buildExtensionLanguageMap(languages map[string]*languageInfo, orderedKeyList []string) map[string][]string { 60 extensionLangsMap := make(map[string][]string) 61 for _, lang := range orderedKeyList { 62 langInfo := languages[lang] 63 for _, extension := range langInfo.Extensions { 64 extensionLangsMap[extension] = append(extensionLangsMap[extension], lang) 65 } 66 } 67 68 return extensionLangsMap 69 } 70 71 func buildLanguageExtensionsMap(languages map[string]*languageInfo) map[string][]string { 72 langExtensionMap := make(map[string][]string, len(languages)) 73 for lang, info := range languages { 74 if len(info.Extensions) > 0 { 75 langExtensionMap[lang] = info.Extensions 76 } 77 } 78 79 return langExtensionMap 80 } 81 82 func executeExtensionsTemplate(out io.Writer, extInfo *extensionsInfo, tmplPath, tmplName, commit string) error { 83 fmap := template.FuncMap{ 84 "formatStringSlice": func(slice []string) string { return `"` + strings.Join(slice, `","`) + `"` }, 85 } 86 return executeTemplate(out, tmplName, tmplPath, commit, fmap, extInfo) 87 }