github.com/dennwc/enry@v1.6.4-0.20180424151738-42391b8e105b/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  		"getCommit":         func() string { return commit },
    85  		"formatStringSlice": func(slice []string) string { return `"` + strings.Join(slice, `","`) + `"` },
    86  	}
    87  
    88  	t := template.Must(template.New(tmplName).Funcs(fmap).ParseFiles(tmplPath))
    89  	if err := t.Execute(out, extInfo); err != nil {
    90  		return err
    91  	}
    92  
    93  	return nil
    94  }