github.com/wawandco/ox@v0.13.6-0.20230809142027-913b3d837f2a/internal/source/source.go (about)

     1  package source
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  	"text/template"
     9  
    10  	"github.com/gobuffalo/flect"
    11  	"github.com/wawandco/ox/internal/log"
    12  )
    13  
    14  var (
    15  	helpers = template.FuncMap{
    16  		"capitalize": func(field string) string {
    17  			return flect.Capitalize(field)
    18  		},
    19  		"pascalize": func(field string) string {
    20  			return flect.Pascalize(field)
    21  		},
    22  		"pluralize": func(field string) string {
    23  			return flect.Pluralize(flect.Capitalize(field))
    24  		},
    25  		"properize": func(field string) string {
    26  			return flect.Capitalize(flect.Singularize(field))
    27  		},
    28  		"singularize": func(field string) string {
    29  			return flect.Singularize(field)
    30  		},
    31  		"underscore": func(field string) string {
    32  			return flect.Underscore(field)
    33  		},
    34  	}
    35  )
    36  
    37  // TODO: https://pkg.go.dev/golang.org/x/tools/imports
    38  
    39  // Build a template and write it to the passed path in the filename
    40  // if folder does not exist this function will take care of creating it,
    41  // also if there is any error it will return that.
    42  func Build(filename, source string, data interface{}) error {
    43  	path := filepath.Dir(filename)
    44  	err := os.MkdirAll(path, 0777)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	tmpl := template.New(filename).Funcs(helpers)
    50  	tmpl, err = tmpl.Parse(source)
    51  	if err != nil {
    52  		return fmt.Errorf("error intializing template: %w", err)
    53  	}
    54  
    55  	sbf := bytes.NewBuffer([]byte{})
    56  	err = tmpl.Execute(sbf, data)
    57  	if err != nil {
    58  		return fmt.Errorf("error executing template: %w", err)
    59  	}
    60  
    61  	err = os.WriteFile(filename, sbf.Bytes(), 0777)
    62  	if err != nil {
    63  		return fmt.Errorf("error writing file: %w", err)
    64  	}
    65  
    66  	log.Infof("generated %v", filename)
    67  	return nil
    68  }