Skip to content

Commit

Permalink
appending factories into existing files
Browse files Browse the repository at this point in the history
  • Loading branch information
strider2038 committed Nov 24, 2024
1 parent 5ccec14 commit dc25f9c
Show file tree
Hide file tree
Showing 8 changed files with 115 additions and 33 deletions.
2 changes: 1 addition & 1 deletion examples/basic/di/container.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/basic/di/internal/bitset.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/basic/di/internal/container.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/basic/di/internal/lookup/container.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

89 changes: 66 additions & 23 deletions internal/di/factories_generator.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package di

import (
"bytes"
"fmt"
"os"
"strings"

Expand Down Expand Up @@ -32,39 +34,80 @@ func (g *FactoriesGenerator) Generate() ([]*File, error) {
files := make([]*File, 0, len(servicesByFiles))

for filename, services := range servicesByFiles {
if g.isFactoryFileExist(filename) {
continue
}
var file *File
var err error

file := NewFileBuilder(filename, "factories", FactoriesPackage)
file.AddImportAliases(g.container.Imports)

for _, service := range services {
file.Add(
jen.Line(),
jen.Func().Id("Create"+strings.Title(service.Prefix)+service.Title()).
Params(
jen.Id("ctx").Qual("context", "Context"),
jen.Id("c").Qual(g.params.packageName(LookupPackage), "Container"),
).
Params(
jen.Do(g.container.Type(service.Type)),
jen.Error(),
).
Block(jen.Panic(jen.Lit("not implemented"))),
)
if g.isFactoryFileExist(filename) {
file, err = g.generateAppendFile(filename, services)
} else {
file, err = g.generateNewFile(filename, services)
}

content, err := file.GetFile()
if err != nil {
return nil, err
}
files = append(files, content)

files = append(files, file)
}

return files, nil
}

func (g *FactoriesGenerator) generateNewFile(filename string, services []*ServiceDefinition) (*File, error) {
file := NewFileBuilder(filename, "factories", FactoriesPackage)
file.AddImportAliases(g.container.Imports)

for _, service := range services {
file.Add(
jen.Line(),
jen.Func().Id("Create"+strings.Title(service.Prefix)+service.Title()).
Params(
jen.Id("ctx").Qual("context", "Context"),
jen.Id("c").Qual(g.params.packageName(LookupPackage), "Container"),
).
Params(
jen.Do(g.container.Type(service.Type)),
jen.Error(),
).
Block(jen.Panic(jen.Lit("not implemented"))),
)
}

return file.GetFile()
}

func (g *FactoriesGenerator) generateAppendFile(filename string, services []*ServiceDefinition) (*File, error) {
var content bytes.Buffer

for _, service := range services {
factoryName := strings.Title(service.Prefix) + service.Title()
if _, exists := g.container.Factories[factoryName]; exists {
continue
}

content.WriteString("\n")
content.WriteString(fmt.Sprintf("%#v",
jen.Func().Id("Create"+factoryName).
Params(
jen.Id("ctx").Qual("context", "Context"),
jen.Id("c").Qual(g.params.packageName(LookupPackage), "Container"),
).
Params(
jen.Do(g.container.Type(service.Type)),
jen.Error(),
).
Block(jen.Panic(jen.Lit("not implemented"))),
))
content.WriteString("\n")
}

return &File{
Package: FactoriesPackage,
Name: filename,
Content: content.Bytes(),
Append: true,
}, nil
}

func (g *FactoriesGenerator) isFactoryFileExist(filename string) bool {
_, err := os.Stat(g.workDir + "/" + packageDirs[FactoriesPackage] + "/" + filename)

Expand Down
5 changes: 5 additions & 0 deletions internal/di/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type File struct {
Package PackageType
Name string
Content []byte
Append bool
}

func (f *File) Path() string {
Expand All @@ -43,6 +44,10 @@ func (f *File) Path() string {
return path + f.Name
}

func (f *File) IsEmpty() bool {
return len(f.Content) == 0
}

type FileBuilder struct {
file *jen.File
fileName string
Expand Down
16 changes: 12 additions & 4 deletions internal/di/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,20 +146,28 @@ func (g *Generator) generateFactoriesFiles(container *RootContainerDefinition) e
RootPackage: g.RootPackage(),
ErrorHandling: g.ErrorWrapping.Defaults(),
}
manager := NewFactoriesGenerator(container, g.BaseDir, params)
files, err := manager.Generate()
generator := NewFactoriesGenerator(container, g.BaseDir, params)
files, err := generator.Generate()
if err != nil {
return err
}

for _, file := range files {
if file.IsEmpty() {
continue
}
writer := NewWriter(g.BaseDir)
writer.Append = file.Append
err = writer.WriteFile(file)
if err != nil {
return err
}

g.Logger.Info("factories file", file.Path(), "generated")
action := "generated"
if writer.Append {
action = "updated"
}
g.Logger.Info("factories file", file.Path(), action)
}

return nil
Expand All @@ -183,7 +191,7 @@ func (g *Generator) generateUtils() error {
return err
}

g.Logger.Info("bitset file", file.Path(), "generated")
g.Logger.Info("file", file.Path(), "generated")

return nil
}
Expand Down
30 changes: 28 additions & 2 deletions internal/di/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
type Writer struct {
WorkDir string
Overwrite bool
Append bool
Heading []byte
}

Expand All @@ -24,10 +25,19 @@ func (w *Writer) WriteFile(file *File) error {
}
filename += file.Name

if !w.Overwrite && isFileExist(filename) {
return errors.Errorf("cannot write to file %s: %w", filename, ErrFileAlreadyExists)
if isFileExist(filename) {
if w.Append {
return w.append(file, filename)
}
if !w.Overwrite {
return errors.Errorf("cannot write to file %s: %w", filename, ErrFileAlreadyExists)
}
}

return w.write(file, filename)
}

func (w *Writer) write(file *File, filename string) error {
dir := filepath.Dir(filename)
err := os.MkdirAll(dir, 0775)
if err != nil {
Expand All @@ -42,8 +52,24 @@ func (w *Writer) WriteFile(file *File) error {
return nil
}

func (w *Writer) append(file *File, filename string) error {
return appendFile(filename, file.Content, 0644)
}

func isFileExist(filename string) bool {
_, err := os.Stat(filename)

return err == nil
}

func appendFile(name string, data []byte, perm os.FileMode) error {
f, err := os.OpenFile(name, os.O_APPEND|os.O_WRONLY|os.O_CREATE, perm)
if err != nil {
return err
}
_, err = f.Write(data)
if err1 := f.Close(); err1 != nil && err == nil {
err = err1
}
return err
}

0 comments on commit dc25f9c

Please sign in to comment.