diff --git a/generator/plugins/dataloader/data_loader_generator.go b/generator/plugins/dataloader/data_loader_generator.go index 4535081..af6781c 100644 --- a/generator/plugins/dataloader/data_loader_generator.go +++ b/generator/plugins/dataloader/data_loader_generator.go @@ -1,12 +1,15 @@ package dataloader import ( + "bytes" + "fmt" "os" "reflect" "text/template" "github.com/EGT-Ukraine/dataloaden/pkg/generator" "github.com/pkg/errors" + "golang.org/x/tools/imports" "github.com/EGT-Ukraine/go2gql/generator/plugins/graphql" "github.com/EGT-Ukraine/go2gql/generator/plugins/graphql/lib/importer" @@ -14,8 +17,11 @@ import ( const DefaultWaitDurationMs = 10 -type LoadersContext struct { +type LoadersHeadContext struct { Imports []importer.Import +} + +type LoadersBodyContext struct { Loaders []Loader } @@ -31,17 +37,14 @@ type Loader struct { type LoaderGenerator struct { dataLoader *DataLoader + importer *importer.Importer } func NewLoaderGenerator(dataLoader *DataLoader) *LoaderGenerator { - return &LoaderGenerator{dataLoader: dataLoader} + return &LoaderGenerator{dataLoader: dataLoader, importer: &importer.Importer{}} } func (p *LoaderGenerator) GenerateDataLoaders() error { - if len(p.dataLoader.Loaders) == 0 { - return nil - } - if err := os.MkdirAll(p.dataLoader.OutputPath, os.ModePerm); err != nil { return errors.Wrap(err, "failed to create output path dir "+p.dataLoader.OutputPath) } @@ -105,17 +108,24 @@ func (p *LoaderGenerator) generateSchemaLoaders() error { return nil } -func (p *LoaderGenerator) renderLoaders(out *os.File) error { - tmpl, err := templatesLoadersGohtmlBytes() +func (p *LoaderGenerator) generateBody() ([]byte, error) { + buf := new(bytes.Buffer) + + tmpl, err := templatesLoaders_bodyGohtmlBytes() if err != nil { - return errors.Wrap(err, "failed to get loaders template") + return nil, errors.Wrap(err, "failed to get loaders template") } - fileImporter := &importer.Importer{} + importFunc := func(importPath string) func() string { + return func() string { + return p.importer.New(importPath) + } + } templateFuncs := map[string]interface{}{ + "timePkg": importFunc("time"), "goType": func(typ graphql.GoType) string { - return typ.String(fileImporter) + return typ.String(p.importer) }, "duration": func(duration int) int { if duration == 0 { @@ -126,9 +136,9 @@ func (p *LoaderGenerator) renderLoaders(out *os.File) error { }, } - servicesTpl, err := template.New("config").Funcs(templateFuncs).Parse(string(tmpl)) + servicesTpl, err := template.New("loaders_body").Funcs(templateFuncs).Parse(string(tmpl)) if err != nil { - return errors.Wrap(err, "failed to parse template") + return nil, errors.Wrap(err, "failed to parse template") } var loaders []Loader @@ -136,41 +146,87 @@ func (p *LoaderGenerator) renderLoaders(out *os.File) error { for _, dataLoaderModel := range p.dataLoader.Loaders { service := dataLoaderModel.Service - fileImporter.New(service.CallInterface.Pkg) - requestGoType := dataLoaderModel.InputGoType responseGoType := dataLoaderModel.OutputGoType - fileImporter.New(requestGoType.Pkg) - loaderTypeName := responseGoType.ElemType.Name if responseGoType.Kind == reflect.Slice { loaderTypeName = responseGoType.ElemType.ElemType.Name + "Slice" - fileImporter.New(responseGoType.ElemType.ElemType.Pkg) - } else { - fileImporter.New(responseGoType.Pkg) } loaders = append(loaders, Loader{ LoaderTypeName: loaderTypeName, Service: *service, - FetchCode: dataLoaderModel.FetchCode(fileImporter), + FetchCode: dataLoaderModel.FetchCode(p.importer), RequestGoType: requestGoType, ResponseGoType: responseGoType, Config: dataLoaderModel.Config, }) } - configContext := LoadersContext{ - Imports: fileImporter.Imports(), + context := LoadersBodyContext{ Loaders: loaders, } - err = servicesTpl.Execute(out, configContext) + err = servicesTpl.Execute(buf, context) + if err != nil { + return nil, errors.Wrap(err, "failed to execute template") + } + + return buf.Bytes(), nil +} + +func (p *LoaderGenerator) generateHead() ([]byte, error) { + buf := new(bytes.Buffer) + tmpl, err := templatesLoaders_headGohtmlBytes() + if err != nil { + return nil, errors.Wrap(err, "failed to get head template") + } + bodyTpl, err := template.New("loaders_head").Parse(string(tmpl)) + if err != nil { + return nil, errors.Wrap(err, "failed to parse template") + } + + context := LoadersHeadContext{ + Imports: p.importer.Imports(), + } + + err = bodyTpl.Execute(buf, context) + if err != nil { + return nil, errors.Wrap(err, "failed to execute template") + } + + return buf.Bytes(), nil +} + +func (p *LoaderGenerator) renderLoaders(out *os.File) error { + body, err := p.generateBody() + if err != nil { + return errors.Wrap(err, "failed to generate body") + } + head, err := p.generateHead() + if err != nil { + return errors.Wrap(err, "failed to generate head") + } + r := bytes.Join([][]byte{ + head, + body, + }, nil) + + res, err := imports.Process("file", r, &imports.Options{ + Comments: true, + }) + + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + } else { + r = res + } + _, err = out.Write(r) if err != nil { - return errors.Wrap(err, "failed to execute template") + return errors.Wrap(err, "failed to write output") } return nil diff --git a/generator/plugins/dataloader/templates.go b/generator/plugins/dataloader/templates.go index 65e2459..8e0448a 100644 --- a/generator/plugins/dataloader/templates.go +++ b/generator/plugins/dataloader/templates.go @@ -1,6 +1,7 @@ // Code generated by go-bindata. // sources: -// generator/plugins/dataloader/templates/loaders.gohtml +// generator/plugins/dataloader/templates/loaders_body.gohtml +// generator/plugins/dataloader/templates/loaders_head.gohtml // generator/plugins/dataloader/templates/output_object_fields.gohtml // DO NOT EDIT! @@ -69,22 +70,42 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _templatesLoadersGohtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x54\xc1\x6a\x1b\x31\x10\x3d\x4b\x5f\x31\x98\x50\xbc\xc6\xd9\x85\x1e\x0d\x3e\x14\xa7\x31\xa1\x4d\x29\x6d\xda\x1c\x42\x0e\xaa\x76\xbc\x16\x91\x25\x47\x3b\xeb\x26\x08\xfd\x7b\xd1\xae\x1c\x6f\x92\x0d\xce\xa1\x27\x1b\xcd\xd3\xbc\x37\xf3\xde\xca\xfb\x53\x28\x26\x95\xa5\xc7\x2d\xce\xa0\x52\xb4\x6e\xfe\xe4\xd2\x6e\x8a\xcf\xcb\xab\xd3\x5f\x77\x4e\x28\x83\x45\x65\x3f\x56\xf7\xba\xa8\xd0\xa0\x13\x64\x5d\xb1\xd5\x4d\xa5\x4c\x5d\x94\x82\x84\xb6\xa2\x44\x97\x7f\x6d\x7f\xea\x85\x35\x84\x0f\x34\x29\xe0\x34\x04\xce\xb7\x42\xde\x89\x0a\xa1\x03\xd5\x9c\xab\xcd\xd6\x3a\x82\x31\x67\x23\xd9\x41\x47\x9c\x8d\x48\x6d\x70\xc4\x39\xf3\xde\x09\x53\x21\x9c\x24\xd8\x6c\x0e\x27\xf9\x45\xfb\xbf\x6e\x1b\x32\xe6\x7d\x2a\xe6\x9f\xb4\x12\x75\x08\x30\x3a\x1c\x7d\x17\xb4\x0e\x61\x14\x1b\xa1\x29\xdb\x1b\x19\xe7\x71\x36\xe8\xf4\x2d\xb4\x42\x43\x35\x28\x43\xe8\x56\x42\x22\xf8\x1e\x6b\xa7\xb2\x63\x4d\xf3\x24\xd6\x25\x92\xf7\xa9\x9e\xff\x44\xb7\x53\x12\xf3\x6f\x62\x83\x21\x74\x2d\xc7\x19\x78\x5f\xd9\xab\x48\xf5\x12\xb7\x10\x5a\x5f\xec\x09\x63\xbb\x83\xba\x90\xd4\x9d\x09\x12\x7b\xc6\x9a\x5c\x23\xe9\x9d\xc2\x0e\xaa\x16\xd6\xac\x54\x95\x44\x75\x20\x38\x54\xbb\x83\x28\xaf\x0f\x18\x92\x52\x1e\xa4\x24\x33\xbf\xe0\x63\x3b\x57\x27\xcc\x07\xce\x77\xc2\x0d\xe3\x60\xfe\xf6\xfd\x78\x71\xd5\x18\x09\x4b\xa4\x54\xb9\x56\xb4\x4e\xd8\xb1\xa4\x07\x48\x91\xc8\x53\x79\x0a\x62\xab\xf6\x96\x3d\x33\x30\x7b\x09\x8d\xeb\xea\x31\xc7\x55\x7d\xe8\x2d\xf5\x3f\x2c\x73\x06\xd2\xa1\x20\x7c\x03\x14\xf5\xf7\xf5\xe6\xef\x88\x4c\x36\xed\x1b\xc0\x02\xe7\xcc\x21\x35\xce\x3c\x4d\x17\x17\xf4\x5b\xe8\x06\xbb\xf6\x83\xbb\x7d\x76\x9c\x45\x1f\x8f\x8e\xda\xda\x70\x74\x9c\xd7\x76\xc8\x56\xf8\xbb\x93\x9e\x1d\x0d\x60\xb4\x2d\x8d\x7c\x0c\xea\x39\x63\x2b\x24\xb9\x9e\x41\x94\x3f\xbe\xc3\xc7\xfa\xb5\x92\x1f\x78\xdf\x60\x4d\xcb\xf6\x34\x2a\x18\xdf\xdc\x0e\x80\xea\xad\x35\x35\xee\x51\x53\xb8\xb9\x45\xe7\xac\xcb\xa2\x9e\x7e\x0e\xce\x23\xe1\xc2\x96\xed\x67\xcb\xc2\x94\x33\xf6\x57\x28\x9a\x81\xf7\x65\xe3\x04\x29\x6b\xe0\xc5\xfe\xae\x85\xa2\xb3\x54\xbb\x8c\xef\xd3\x04\xe2\xf3\x96\x5f\x2a\xad\x55\x8d\xd2\x9a\x72\x1a\xbd\x0e\xfc\x60\xfd\xd3\x77\xd1\x8b\xec\xb9\xb3\x9b\xb4\xf8\x21\x33\x32\x98\xf4\x1f\x0d\xcf\xd9\x4e\xe8\xe8\xb4\xa4\x87\xbc\x8b\xcc\x60\x5a\x32\xce\x99\x5a\x41\x04\xcf\xe7\x60\x94\x6e\x47\x4e\x1e\x18\xa5\x9f\xc5\x70\x27\x74\x3e\xee\xf3\xc4\x78\xfd\x0b\x00\x00\xff\xff\xbd\x30\xe8\xa7\x33\x06\x00\x00") +var _templatesLoaders_bodyGohtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x54\x4d\x6f\x1a\x31\x10\x3d\xdb\xbf\x62\x0e\x51\xc5\x22\xb2\x2b\xf5\x88\xc4\x89\x34\xa8\x6a\x53\x55\x6d\xda\x1c\xa2\x1c\x5c\xef\xb0\xb1\x30\x36\xf1\xce\x52\x90\xe5\xff\x5e\x79\x3f\xc2\x42\x36\x82\x43\x4f\x48\x33\x6f\x67\xde\xbc\xf7\x8c\xf7\xd7\x90\x8d\x0b\x4b\xfb\x0d\x4e\xa1\x50\xf4\x5c\xfd\x49\xa5\x5d\x67\x9f\x16\xf7\xd7\xbf\x56\x4e\x28\x83\x59\x61\x3f\x16\x2f\x3a\x2b\xd0\xa0\x13\x64\x5d\xb6\xd1\x55\xa1\x4c\x99\xe5\x82\x84\xb6\x22\x47\x97\x7e\xad\x7f\xca\xb9\x35\x84\x3b\x1a\x67\x70\x1d\x02\xe7\x71\x2c\x34\xad\xb9\x56\x68\xa8\x04\x65\x08\xdd\x52\x48\x04\xcf\x99\xf7\x4e\x98\x02\xe1\xaa\x99\x02\xd3\x19\x5c\x75\xa3\xea\x09\x8c\x2d\x90\xbc\x6f\xfb\xe9\x4f\x74\x5b\x25\x31\xfd\x26\xd6\x18\x42\x33\x72\x94\x80\xf7\x85\xbd\x8f\xab\x4e\x71\x73\xa1\xf5\xe7\x6e\x61\x1c\xe7\x3d\x9a\xbc\x9e\xdc\xb1\xbb\x11\x24\xba\x8d\x25\xb9\x4a\xd2\x85\xc4\x0e\xac\xe6\xd6\x2c\x55\xd1\x92\x6a\x40\x70\xe8\x36\x85\x48\xaf\x0f\x18\xa2\x92\x1f\xa8\xb4\x3a\x7e\xc1\x7d\x7d\x57\x43\xcc\x07\xce\xb7\xc2\x0d\xe3\x60\xf6\xfe\xf7\xf1\xc3\x65\x65\x24\x2c\x90\xda\xce\x83\xa2\xe7\x16\x3b\x92\xb4\x03\xd9\x94\xd3\xb6\x3d\x01\xb1\x51\x9d\x65\x47\x06\x26\xa7\xd0\x28\x57\x6f\x73\x94\xea\x43\x4f\xd4\xff\x20\xe6\x14\xa4\x43\x41\xf8\x0e\x28\xf2\xef\xf3\x4d\x2f\x88\x4c\x32\xe9\x1b\xc0\x02\xe7\xcc\x21\x55\xce\xbc\x5e\x17\x05\xfa\x2d\x74\x85\xcd\xf8\x41\x6d\x8f\xca\x49\xf4\xf1\xec\xa9\xb5\x0d\x67\xcf\x79\x6b\x87\xac\x89\x5f\x9c\xf4\xe4\x6c\x00\xa3\x6d\xed\xc9\xe7\xa0\x9e\x33\xb6\x44\x92\xcf\x53\x88\xf4\x47\x2b\xdc\x97\x6f\x99\xfc\xc0\x97\x0a\x4b\x5a\xd4\xd5\xc8\x60\xf4\xf8\x34\x00\x2a\x37\xd6\x94\xd8\xa1\x26\xf0\xf8\x84\xce\x59\x97\x44\x3e\xfd\x1c\xdc\xc6\x85\x73\x9b\xd7\xcf\x96\x85\x09\x67\xec\xaf\x50\x34\x05\xef\xf3\xca\x09\x52\xd6\xc0\x89\x7e\x0f\x42\xd1\x4d\xdb\xbb\x2b\x43\x80\x31\x78\x4f\x6a\x8d\xdf\x57\x45\x08\xe9\x9d\xd2\x5a\x95\x28\xad\xc9\x27\xd1\xf2\xc0\x0f\x09\x78\x7d\x1e\xbd\xe4\xde\x3a\xbb\x6e\xf5\x1f\xf2\x24\x81\x71\xff\xbf\xc3\x73\xb6\x15\x3a\x1a\x2e\x69\x97\x36\xc9\x19\x0c\x4d\xc2\x39\x53\x4b\x88\xe0\xd9\x0c\x8c\xd2\xf5\xe5\xad\x15\x46\xe9\xa3\x34\x6e\x85\x4e\x47\xfd\x3d\x31\x65\xff\x02\x00\x00\xff\xff\xf8\xbc\x26\x67\xb5\x05\x00\x00") -func templatesLoadersGohtmlBytes() ([]byte, error) { +func templatesLoaders_bodyGohtmlBytes() ([]byte, error) { return bindataRead( - _templatesLoadersGohtml, - "templates/loaders.gohtml", + _templatesLoaders_bodyGohtml, + "templates/loaders_body.gohtml", ) } -func templatesLoadersGohtml() (*asset, error) { - bytes, err := templatesLoadersGohtmlBytes() +func templatesLoaders_bodyGohtml() (*asset, error) { + bytes, err := templatesLoaders_bodyGohtmlBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/loaders.gohtml", size: 1587, mode: os.FileMode(436), modTime: time.Unix(1546955364, 0)} + info := bindataFileInfo{name: "templates/loaders_body.gohtml", size: 1461, mode: os.FileMode(436), modTime: time.Unix(1547023714, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _templatesLoaders_headGohtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x44\x8c\xc1\x4a\x03\x31\x10\x86\xef\xf3\x14\xc3\xd2\x83\x16\x36\x01\x8f\x05\x0f\x22\x22\x82\x07\x0f\xfa\x00\xe3\xee\x30\x0d\x4d\x93\x98\x4c\x41\x19\xf2\xee\x42\xba\xd0\xd3\x0c\xff\xf7\xfd\xbf\xd9\x8c\x7e\x2f\x59\xff\x0a\x1f\x50\x82\x1e\x2f\xdf\x6e\xc9\x67\xff\xf2\xfa\x39\x7f\x9d\x2a\x85\xc4\x5e\xf2\x83\xfc\x44\x2f\x9c\xb8\x92\xe6\xea\x4b\xbc\x48\x48\xcd\xaf\xa4\x14\x33\xad\x5c\xdd\xfb\x38\xed\x39\x27\xe5\x5f\xdd\x7b\x9c\x7b\x07\x28\xb4\x9c\x48\x18\xaf\x52\x03\x08\xe7\x92\xab\xe2\x1d\x4c\xcb\xd5\x9c\x00\xcc\x2a\x25\x61\xdc\x6d\xf0\xf0\x88\x3b\xf7\x36\xfe\x36\x66\x10\x11\xcd\x36\xec\x9e\x62\xa0\xd6\x3b\x4e\xb7\xe8\x83\xf4\xd8\xfb\x04\x66\x9c\xd6\x51\xb9\x87\xff\x00\x00\x00\xff\xff\x9c\x9d\x2c\x6b\xda\x00\x00\x00") + +func templatesLoaders_headGohtmlBytes() ([]byte, error) { + return bindataRead( + _templatesLoaders_headGohtml, + "templates/loaders_head.gohtml", + ) +} + +func templatesLoaders_headGohtml() (*asset, error) { + bytes, err := templatesLoaders_headGohtmlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/loaders_head.gohtml", size: 218, mode: os.FileMode(436), modTime: time.Unix(1547023714, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -161,7 +182,8 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "templates/loaders.gohtml": templatesLoadersGohtml, + "templates/loaders_body.gohtml": templatesLoaders_bodyGohtml, + "templates/loaders_head.gohtml": templatesLoaders_headGohtml, "templates/output_object_fields.gohtml": templatesOutput_object_fieldsGohtml, } @@ -207,7 +229,8 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "templates": &bintree{nil, map[string]*bintree{ - "loaders.gohtml": &bintree{templatesLoadersGohtml, map[string]*bintree{}}, + "loaders_body.gohtml": &bintree{templatesLoaders_bodyGohtml, map[string]*bintree{}}, + "loaders_head.gohtml": &bintree{templatesLoaders_headGohtml, map[string]*bintree{}}, "output_object_fields.gohtml": &bintree{templatesOutput_object_fieldsGohtml, map[string]*bintree{}}, }}, }} diff --git a/generator/plugins/dataloader/templates/loaders.gohtml b/generator/plugins/dataloader/templates/loaders_body.gohtml similarity index 85% rename from generator/plugins/dataloader/templates/loaders.gohtml rename to generator/plugins/dataloader/templates/loaders_body.gohtml index 05bf828..4c32ad3 100644 --- a/generator/plugins/dataloader/templates/loaders.gohtml +++ b/generator/plugins/dataloader/templates/loaders_body.gohtml @@ -1,15 +1,4 @@ -{{- /*gotype: github.com/EGT-Ukraine/go2gql/generator/plugins/dataloader.LoadersContext*/ -}} - -package loaders - -import ( - "context" - "time" - - {{range $import := $.Imports -}} - {{$import.Alias}} "{{$import.Path}}" - {{end -}} -) +{{- /*gotype: github.com/EGT-Ukraine/go2gql/generator/plugins/dataloader.LoadersBodyContext*/ -}} type LoaderClients interface { {{range $loader := $.Loaders -}} @@ -43,7 +32,7 @@ func create{{$loader.Config.Name}}(ctx context.Context, client {{goType $loader. fetch: func(keys {{goType $loader.RequestGoType}}) ([]{{goType $loader.ResponseGoType}}, []error) { {{$loader.FetchCode}} }, - wait: {{duration $loader.Config.WaitDurationMs}} * time.Millisecond, + wait: {{duration $loader.Config.WaitDurationMs}} * {{timePkg}}.Millisecond, } } {{end -}} diff --git a/generator/plugins/dataloader/templates/loaders_head.gohtml b/generator/plugins/dataloader/templates/loaders_head.gohtml new file mode 100644 index 0000000..25d9e2a --- /dev/null +++ b/generator/plugins/dataloader/templates/loaders_head.gohtml @@ -0,0 +1,11 @@ +{{- /*gotype: github.com/EGT-Ukraine/go2gql/generator/plugins/dataloader.LoadersHeadContext*/ -}} + +package loaders + +import ( +"context" + +{{range $import := $.Imports -}} + {{$import.Alias}} "{{$import.Path}}" +{{end -}} +)