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  }