github.com/rohankumardubey/go-enry@v1.7.3/internal/code-generator/generator/filenames.go (about) 1 package generator 2 3 import ( 4 "bytes" 5 "io" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "strings" 10 "text/template" 11 12 yaml "gopkg.in/yaml.v2" 13 ) 14 15 // Filenames reads from fileToParse and builds source file from tmplPath. It complies with type File signature. 16 func Filenames(fileToParse, samplesDir, outPath, tmplPath, tmplName, commit string) error { 17 data, err := ioutil.ReadFile(fileToParse) 18 if err != nil { 19 return err 20 } 21 22 languages := make(map[string]*languageInfo) 23 if err := yaml.Unmarshal(data, &languages); err != nil { 24 return err 25 } 26 27 if err := walkSamplesFilenames(samplesDir, languages); err != nil { 28 return err 29 } 30 31 languagesByFilename := buildFilenameLanguageMap(languages) 32 33 buf := &bytes.Buffer{} 34 if err := executeFilenamesTemplate(buf, languagesByFilename, tmplPath, tmplName, commit); err != nil { 35 return err 36 } 37 38 return formatedWrite(outPath, buf.Bytes()) 39 } 40 41 func walkSamplesFilenames(samplesDir string, languages map[string]*languageInfo) error { 42 const filenamesDir = "filenames" 43 var language string 44 err := filepath.Walk(samplesDir, func(path string, f os.FileInfo, err error) error { 45 if err != nil { 46 return err 47 } 48 49 if f.IsDir() { 50 if f.Name() != filenamesDir { 51 language = f.Name() 52 } 53 54 return nil 55 } 56 57 parentDir := filepath.Base(filepath.Dir(path)) 58 if parentDir != filenamesDir { 59 return nil 60 } 61 62 info, ok := languages[language] 63 if !ok { 64 info = &languageInfo{Filenames: []string{}} 65 } 66 67 for _, filename := range info.Filenames { 68 if filename == f.Name() { 69 return nil 70 } 71 } 72 73 info.Filenames = append(info.Filenames, f.Name()) 74 75 return nil 76 }) 77 78 return err 79 } 80 81 func buildFilenameLanguageMap(languages map[string]*languageInfo) map[string][]string { 82 filenameLangMap := make(map[string][]string) 83 for lang, langInfo := range languages { 84 for _, filename := range langInfo.Filenames { 85 filenameLangMap[filename] = append(filenameLangMap[filename], lang) 86 } 87 } 88 89 return filenameLangMap 90 } 91 92 func executeFilenamesTemplate(out io.Writer, languagesByFilename map[string][]string, tmplPath, tmplName, commit string) error { 93 fmap := template.FuncMap{ 94 "formatStringSlice": func(slice []string) string { return `"` + strings.Join(slice, `","`) + `"` }, 95 } 96 return executeTemplate(out, tmplName, tmplPath, commit, fmap, languagesByFilename) 97 }