作者 yangfu

pm init

  1 +# Binaries for programs and plugins
  2 +*.exe
  3 +*.dll
  4 +*.so
  5 +*.dylib
  6 +*.vscode
  7 +
  8 +# Test binary, build with `go test -c`
  9 +*.test
  10 +
  11 +# Output of the go coverage tool, specifically when used with LiteIDE
  12 +*.out
  13 +
  14 +*.log
  15 +*debug
  16 +*wasm
  17 +
  18 +*.idea
  19 +*.sum
  20 +
  21 +# protoc
  22 +#*.pb.go
  1 +module pm
  2 +
  3 +go 1.16
  4 +
  5 +require (
  6 + github.com/tal-tech/go-zero v1.0.27
  7 + github.com/tiptok/gocomm v1.0.12
  8 + gopkg.in/yaml.v2 v2.3.0
  9 +)
  10 +
  11 +replace (
  12 + github.com/tiptok/gocomm v1.0.12 => F:\go\src\learn_project\gocomm
  13 +)
  1 +package main
  2 +
  3 +import (
  4 + "bytes"
  5 + "flag"
  6 + "fmt"
  7 + "github.com/tal-tech/go-zero/core/mapping"
  8 + "github.com/tiptok/gocomm/common"
  9 + "github.com/tiptok/gocomm/gs"
  10 + "gopkg.in/yaml.v2"
  11 + "html/template"
  12 + "io/fs"
  13 + "io/ioutil"
  14 + "os"
  15 + "path/filepath"
  16 + "sort"
  17 + "strings"
  18 +)
  19 +
  20 +const (
  21 + ModulePrintModel ="print"
  22 + ModulePrintGateway ="gateway"
  23 +)
  24 +
  25 +var projectPath string
  26 +var useCase string
  27 +
  28 +func init(){
  29 + flag.StringVar(&useCase,"m","print","module 1.print(打印模型) 2.gateway(输出网关接口)")
  30 + flag.StringVar(&projectPath,"p","F:\\go\\src\\mmm-go-pp\\terms\\document\\terms","项目描述文件根目录")
  31 +}
  32 +var attrMap map[string]*MetaDataItem = make(map[string]*MetaDataItem)
  33 +var schemaMap map[string]Schema = make(map[string]Schema)
  34 +var apiMap map[string]ApiItem= make(map[string]ApiItem)
  35 +var apiKey []string
  36 +
  37 +func main(){
  38 + flag.Parse()
  39 + schemaPath:=filepath.Join(projectPath,"schemas")
  40 + attributesPath:=filepath.Join(projectPath,"attributes")
  41 + apiPath:=filepath.Join(projectPath,"api")
  42 + valid()
  43 + initSchema(schemaPath)
  44 + initAttr(attributesPath)
  45 + initApi(apiPath)
  46 + switch useCase {
  47 + case ModulePrintModel:
  48 + printSchema()
  49 + case ModulePrintGateway:
  50 + printGateWay()
  51 + }
  52 +}
  53 +
  54 +func valid(){
  55 + if _,err:=os.Stat(projectPath);err!=nil{
  56 + fmt.Println(err)
  57 + }
  58 +}
  59 +
  60 +func initSchema(schemaPath string){
  61 + schemaFiles,_ :=ioutil.ReadDir(schemaPath)
  62 + for _,f :=range schemaFiles{
  63 + var schema Schema
  64 + if f.IsDir(){
  65 + continue
  66 + }
  67 + fr,_ :=os.Open(filepath.Join(schemaPath,f.Name()))
  68 + if err :=mapping.UnmarshalYamlReader(fr,&schema);err!=nil{
  69 + fmt.Printf("file:%v error:%v \n",f.Name(),err.Error())
  70 + continue
  71 + }
  72 + schemaMap[schema.MetaData.Name] = schema
  73 + }
  74 +}
  75 +
  76 +func initAttr(attributesPath string){
  77 + filepath.WalkDir(attributesPath,wrapperWalkDirFunc(readAttr))
  78 +}
  79 +
  80 +func initApi(apiPath string){
  81 + filepath.WalkDir(apiPath,wrapperWalkDirFunc(readApi))
  82 +}
  83 +
  84 +func readAttr(f *os.File)error{
  85 + var attr Attribute
  86 + if err :=mapping.UnmarshalYamlReader(f,&attr);err!=nil{
  87 + return err
  88 + }
  89 + attrMap[attr.MetaDataItem.Name]=attr.MetaDataItem
  90 + return nil
  91 +}
  92 +
  93 +func readApi(f *os.File)error{
  94 + var data gs.MapData
  95 + content, err := ioutil.ReadAll(f)
  96 + if err != nil {
  97 + return err
  98 + }
  99 + if err :=yaml.Unmarshal(content, &data);err!=nil{
  100 + return err
  101 + }
  102 + service :=data.String("metadata.service")
  103 + paths:=data.String("metadata.path")
  104 + endpoints,_:=data.FindField("metadata.endpoints")
  105 + endpointsMap :=endpoints.([]interface{})
  106 + for _,p:=range endpointsMap{
  107 + mapP:=p.(map[interface{}]interface{})
  108 + method :=mapP["method"].(string)
  109 + httpMethod,route :=mapFirstKv(mapP["route"].(map[interface{}]interface{}))
  110 + apiItem:=ApiItem{
  111 + Method:common.CamelCase(service,true)+common.CamelCase(method,true),
  112 + Path: paths+route,
  113 + HttpMethod:strings.ToUpper(httpMethod),
  114 + }
  115 + apiItem.Path = strings.Replace(apiItem.Path,"}","",-1)
  116 + apiItem.Path = strings.Replace(apiItem.Path,"/{","/:",-1)
  117 + apiMap[apiItem.Method] = apiItem
  118 + apiKey = append(apiKey,apiItem.Method)
  119 + }
  120 + return nil
  121 +}
  122 +
  123 +func wrapperWalkDirFunc(doFile func(f *os.File)error)fs.WalkDirFunc{
  124 + return func(path string, d fs.DirEntry, err error)error{
  125 + defer func(){
  126 + if p:=recover();p!=nil{
  127 + fmt.Println(path)
  128 + }
  129 + }()
  130 + if d==nil{
  131 + return nil
  132 + }
  133 + if d.IsDir(){
  134 + return nil
  135 + }
  136 + if f,err:=os.Open(path);err!=nil{
  137 + return err
  138 + }else {
  139 + err=doFile(f)
  140 + }
  141 + return err
  142 + }
  143 +}
  144 +
  145 +func mapFirstOne(mts map[string]interface{})string{
  146 + for k,v:=range mts{
  147 + value:=common.AssertString(v)
  148 + if strings.ToUpper(k)=="ARRAY"{
  149 + return "[]"+value
  150 + }
  151 + return value
  152 + }
  153 + return ""
  154 +}
  155 +
  156 +func mapFirstKv(mts map[interface{}]interface{})(string,string){
  157 + for k,v:=range mts{
  158 + return k.(string),v.(string)
  159 + }
  160 + return "",""
  161 +}
  162 +
  163 +func printSchema(){
  164 + var keys []string
  165 + for k,_:=range schemaMap{
  166 + keys = append(keys,k)
  167 + }
  168 + sort.Strings(keys)
  169 +
  170 +
  171 + for _,k :=range keys{
  172 + schema:=schemaMap[k]
  173 + fmt.Println("\n\n")
  174 + fmt.Printf("%v %v\n\n",schema.MetaData.Name,schema.MetaData.Description)
  175 + for _,v :=range schema.MetaData.Attributes{
  176 + if len(v.Ref)>0{
  177 + if attr,ok:=attrMap[v.Ref];ok{
  178 + fmt.Printf("%-15s %-10s %v\n",attr.Name,mapFirstOne(attr.Type),attr.Description)
  179 + }
  180 + continue
  181 + }
  182 + fmt.Printf("%-15s %-10s %v\n",v.Name,mapFirstOne(v.Type),v.Description)
  183 + }
  184 + }
  185 +}
  186 +
  187 +func printGateWay(){
  188 + var keys []string
  189 + for k,_:=range apiMap{
  190 + keys = append(keys,k)
  191 + }
  192 + sort.Strings(keys)
  193 +
  194 + var apiList []ApiItem
  195 + for _,k:=range keys{
  196 + apiList = append(apiList,apiMap[k])
  197 + }
  198 +
  199 + t:=template.New("gateway")
  200 + gt,err:= t.Parse(gatewayTemplate)
  201 + if err!=nil{
  202 + fmt.Println(err)
  203 + }
  204 + buf :=bytes.NewBuffer(nil)
  205 + gt.Execute(buf,map[string]interface{}{"Routers":apiList})
  206 + fmt.Println("print gateway")
  207 + fmt.Println(buf.String())
  208 +}
  209 +
  1 +package main
  2 +
  3 +type Schema struct {
  4 + MetaData *MetaData `json:"metadata,optional"`
  5 +}
  6 +type MetaData struct {
  7 + Name string `json:"name,optional"`
  8 + Description string `json:"description,optional"`
  9 + Attributes []*Attributes `json:"attributes,optional"`
  10 +}
  11 +type Attributes struct {
  12 + Ref string `json:"ref,optional"`
  13 + Name string `json:"name,optional"`
  14 + Description string `json:"description,optional"`
  15 + Type map[string]interface{} `json:"type,optional"`
  16 +}
  17 +
  18 +type Attribute struct {
  19 + MetaDataItem *MetaDataItem `json:"metadata,optional"`
  20 +}
  21 +type MetaDataItem struct {
  22 + Name string `json:"name,optional"`
  23 + Description string `json:"description,optional"`
  24 + Type map[string]interface{} `json:"type,optional"`
  25 +}
  26 +
  27 +type ApiItem struct {
  28 + Method string
  29 + Path string
  30 + //Router string
  31 + HttpMethod string
  32 +}
  33 +
  34 +const gatewayTemplate =`
  35 +package gateway
  36 +
  37 +const (
  38 + {{range .Routers}}
  39 + {{.Method}} = "{{.Method}}"{{end}}
  40 +)
  41 +
  42 +var DefaultService *HttpDefaultServiceGateway
  43 +
  44 +func init() {
  45 + DefaultService = &HttpDefaultServiceGateway{gs.NewManagerService("127.0.0.1", DefaultRouters())}
  46 + DefaultService.WithDebugModel(true)
  47 +}
  48 +
  49 +type HttpDefaultServiceGateway struct {
  50 + *gs.GatewayService
  51 +}
  52 +
  53 +func DefaultRouters() []gs.Router {
  54 + routers := []gs.Router{
  55 + {{range .Routers}}
  56 + { {{.Method}}, "{{.Path}}", "{{.HttpMethod}}"},{{end}}
  57 + }
  58 + return routers
  59 +}
  60 +`