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 }