| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // Copyright GoFrame gf Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package genctrl
- import (
- "fmt"
- "github.com/gogf/gf/cmd/gf/v2/internal/consts"
- "github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
- "github.com/gogf/gf/v2/container/gmap"
- "github.com/gogf/gf/v2/container/gset"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/gogf/gf/v2/os/gfile"
- "github.com/gogf/gf/v2/text/gstr"
- "github.com/gogf/gf/v2/util/gconv"
- )
- type apiInterfaceGenerator struct{}
- func newApiInterfaceGenerator() *apiInterfaceGenerator {
- return &apiInterfaceGenerator{}
- }
- func (c *apiInterfaceGenerator) Generate(apiModuleFolderPath string, apiModuleApiItems []apiItem) (err error) {
- if len(apiModuleApiItems) == 0 {
- return nil
- }
- var firstApiItem = apiModuleApiItems[0]
- if err = c.doGenerate(apiModuleFolderPath, firstApiItem.Module, apiModuleApiItems); err != nil {
- return
- }
- return
- }
- func (c *apiInterfaceGenerator) doGenerate(apiModuleFolderPath string, module string, items []apiItem) (err error) {
- var (
- moduleFilePath = gfile.Join(apiModuleFolderPath, fmt.Sprintf(`%s.go`, module))
- importPathMap = gmap.NewListMap()
- importPaths []string
- )
- // all import paths.
- importPathMap.Set("\t"+`"context"`, 1)
- importPathMap.Set("\t"+``, 1)
- for _, item := range items {
- importPathMap.Set(fmt.Sprintf("\t"+`"%s"`, item.Import), 1)
- }
- importPaths = gconv.Strings(importPathMap.Keys())
- // interface definitions.
- var (
- doneApiItemSet = gset.NewStrSet()
- interfaceDefinition string
- interfaceContent = gstr.TrimLeft(gstr.ReplaceByMap(consts.TemplateGenCtrlApiInterface, g.MapStrStr{
- "{Module}": module,
- "{ImportPaths}": gstr.Join(importPaths, "\n"),
- }))
- )
- for _, item := range items {
- if doneApiItemSet.Contains(item.String()) {
- continue
- }
- // retrieve all api items of the same module.
- subItems := c.getSubItemsByModuleAndVersion(items, item.Module, item.Version)
- var (
- method string
- methods = make([]string, 0)
- interfaceName = fmt.Sprintf(`I%s%s`, gstr.CaseCamel(item.Module), gstr.UcFirst(item.Version))
- )
- for _, subItem := range subItems {
- method = fmt.Sprintf(
- "\t%s(ctx context.Context, req *%s.%sReq) (res *%s.%sRes, err error)",
- subItem.MethodName, subItem.Version, subItem.MethodName, subItem.Version, subItem.MethodName,
- )
- methods = append(methods, method)
- doneApiItemSet.Add(subItem.String())
- }
- interfaceDefinition += fmt.Sprintf("type %s interface {", interfaceName)
- interfaceDefinition += "\n"
- interfaceDefinition += gstr.Join(methods, "\n")
- interfaceDefinition += "\n"
- interfaceDefinition += fmt.Sprintf("}")
- interfaceDefinition += "\n\n"
- }
- interfaceContent = gstr.TrimLeft(gstr.ReplaceByMap(interfaceContent, g.MapStrStr{
- "{Interfaces}": interfaceDefinition,
- }))
- err = gfile.PutContents(moduleFilePath, interfaceContent)
- mlog.Printf(`generated: %s`, moduleFilePath)
- return
- }
- func (c *apiInterfaceGenerator) getSubItemsByModule(items []apiItem, module string) (subItems []apiItem) {
- for _, item := range items {
- if item.Module == module {
- subItems = append(subItems, item)
- }
- }
- return
- }
- func (c *apiInterfaceGenerator) getSubItemsByModuleAndVersion(items []apiItem, module, version string) (subItems []apiItem) {
- for _, item := range items {
- if item.Module == module && item.Version == version {
- subItems = append(subItems, item)
- }
- }
- return
- }
|