github.com/profzone/eden-framework@v1.0.10/internal/generator/root.go (about) 1 package generator 2 3 import ( 4 "fmt" 5 "github.com/profzone/eden-framework/internal/generator/format" 6 "github.com/profzone/eden-framework/pkg/duration" 7 "golang.org/x/tools/imports" 8 "reflect" 9 "strings" 10 ) 11 12 type Generator interface { 13 Load(path string) 14 Pick() 15 Output(outputPath string) Outputs 16 } 17 18 type Outputs map[string]string 19 20 func (outputs Outputs) Add(filename string, content string) { 21 outputs[filename] = content 22 } 23 24 func (outputs Outputs) WriteFile(filename string, content string) { 25 if IsGoFile(filename) { 26 bytes, err := imports.Process(filename, []byte(content), nil) 27 if err != nil { 28 lines := strings.Split(content, "\n") 29 lengthOfLines := len(lines) 30 lengthOfLastLineString := len(fmt.Sprintf("%d", lengthOfLines+1)) 31 for i, line := range lines { 32 lineString := fmt.Sprintf("%d", i+1) 33 lineString = strings.Repeat(" ", lengthOfLastLineString-len(lineString)) + lineString 34 35 fmt.Printf("%s: %s\n", lineString, line) 36 } 37 panic(err.Error()) 38 } else { 39 bytes, err := format.Process(filename, bytes) 40 if err != nil { 41 panic(err.Error()) 42 } 43 content = string(bytes) 44 } 45 } 46 WriteFile(filename, content) 47 delete(outputs, filename) 48 } 49 50 func (outputs Outputs) WriteFiles() { 51 for filename, content := range outputs { 52 outputs.WriteFile(filename, content) 53 } 54 } 55 56 func Generate(generator Generator, inputPath, outputPath string) { 57 cost := duration.NewDuration() 58 defer func() { 59 cost.ToLogger().Infof("generate by %s done", reflect.TypeOf(generator).String()) 60 }() 61 62 generator.Load(inputPath) 63 generator.Pick() 64 outputs := generator.Output(outputPath) 65 outputs.WriteFiles() 66 }