github.com/zkry/enry@v1.6.3/internal/code-generator/generator/interpreters.go (about)

     1  package generator
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"io/ioutil"
     7  	"strings"
     8  	"text/template"
     9  
    10  	"gopkg.in/yaml.v2"
    11  )
    12  
    13  // Interpreters reads from fileToParse and builds source file from tmplPath. It complies with type File signature.
    14  func Interpreters(fileToParse, samplesDir, outPath, tmplPath, tmplName, commit string) error {
    15  	data, err := ioutil.ReadFile(fileToParse)
    16  	if err != nil {
    17  		return err
    18  	}
    19  
    20  	languages := make(map[string]*languageInfo)
    21  	if err := yaml.Unmarshal(data, &languages); err != nil {
    22  		return err
    23  	}
    24  
    25  	orderedKeys := getAlphabeticalOrderedKeys(languages)
    26  	languagesByInterpreter := buildInterpreterLanguagesMap(languages, orderedKeys)
    27  
    28  	buf := &bytes.Buffer{}
    29  	if err := executeInterpretersTemplate(buf, languagesByInterpreter, tmplPath, tmplName, commit); err != nil {
    30  		return err
    31  	}
    32  
    33  	return formatedWrite(outPath, buf.Bytes())
    34  }
    35  
    36  func buildInterpreterLanguagesMap(languages map[string]*languageInfo, orderedKeys []string) map[string][]string {
    37  	interpreterLangsMap := make(map[string][]string)
    38  	for _, lang := range orderedKeys {
    39  		langInfo := languages[lang]
    40  		for _, interpreter := range langInfo.Interpreters {
    41  			interpreterLangsMap[interpreter] = append(interpreterLangsMap[interpreter], lang)
    42  		}
    43  	}
    44  
    45  	return interpreterLangsMap
    46  }
    47  
    48  func executeInterpretersTemplate(out io.Writer, languagesByInterpreter map[string][]string, tmplPath, tmplName, commit string) error {
    49  	fmap := template.FuncMap{
    50  		"getCommit":         func() string { return commit },
    51  		"formatStringSlice": func(slice []string) string { return `"` + strings.Join(slice, `","`) + `"` },
    52  	}
    53  
    54  	t := template.Must(template.New(tmplName).Funcs(fmap).ParseFiles(tmplPath))
    55  	if err := t.Execute(out, languagesByInterpreter); err != nil {
    56  		return err
    57  	}
    58  
    59  	return nil
    60  }