gitlab.com/thomasboni/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  }