Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
0daryo committed Jun 21, 2021
1 parent 612473f commit b9cf9f7
Show file tree
Hide file tree
Showing 7 changed files with 292 additions and 0 deletions.
21 changes: 21 additions & 0 deletions example/example.go

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

52 changes: 52 additions & 0 deletions example/example_test.go

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

29 changes: 29 additions & 0 deletions example/proto/alive.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
syntax = "proto3";

option go_package="go/service";
import "google/api/annotations.proto";

package gateway;

service AliveService {
rpc GetStatus(AliveRequest) returns (AliveResponse) {
option (google.api.http) = {
post: "/alive"
body: "*"
};
}
}

message AliveRequest {
TestEnum te = 1;
}

message AliveResponse {
bool status = 1;
}

enum TestEnum{
UNKOWN = 0;
ONE = 1;
TWO = 2;
}
22 changes: 22 additions & 0 deletions example/proto/user.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
syntax = "proto3";

option go_package="go/service";
import "google/api/annotations.proto";

package gateway;

service UserService {
rpc GetStatus(UserRequest) returns (UserResponse) {
option (google.api.http) = {
get: "/users/{userId}"
body: "*"
};
}
}

message UserRequest {
}

message UserResponse {
bool status = 1;
}
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module github.com/0daryo/pogen

go 1.16

require github.com/emicklei/proto v1.9.0
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc=
github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
161 changes: 161 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
package main

import (
"bytes"
"flag"
"go/format"
"html/template"
"os"
"path/filepath"
"regexp"

"github.com/emicklei/proto"
)

var (
patternToRegexp map[string]string = make(map[string]string)
output = flag.String("o", "output.go", "output file")
pkg = flag.String("p", "main", "package name")
protoDir = flag.String("d", "proto/service", "proto directory name")
)

type patternRegexp struct {
Pattern string
RegexPattern string
}

func main() {
flag.Parse()
var files []string
root := *protoDir
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
isDir, err := isDir(path)
if err != nil {
return err
}
if isDir {
return nil
}
files = append(files, path)
return nil
})
if err != nil {
panic(err)
}
for _, f := range files {
reader, err := os.Open(f)
if err != nil {
panic(err)
}
defer reader.Close()

parser := proto.NewParser(reader)
definition, err := parser.Parse()
if err != nil {
panic(err)
}
proto.Walk(definition,
proto.WithRPC(handleRPC),
)
}
if err := deleteIfExist(*output); err != nil {
panic(err)
}
file, err := os.Create(*output)
if err != nil {
panic(err)
}
tp := struct {
Pkg string
PatternRegexp []patternRegexp
}{
Pkg: *pkg,
PatternRegexp: func() []patternRegexp {
ret := make([]patternRegexp, 0)
for k, v := range patternToRegexp {
ret = append(ret, patternRegexp{
Pattern: k,
RegexPattern: v,
})
}
return ret
}(),
}
b := new(bytes.Buffer)
if err := tpl.Execute(b, tp); err != nil {
panic(err)
}
formatted, err := format.Source(b.Bytes())
if err != nil {
panic(err)
}
file.Write(formatted)
}

var r = regexp.MustCompile("{.*}")

func handleRPC(s *proto.RPC) {
for _, o := range s.Options {
get, ok := o.Constant.Map["get"]
if ok {
pattern := "^" + r.ReplaceAllString(get.Source, "[a-zA-Z0-9]*") + "$"
patternToRegexp[get.Source] = pattern
}
post, ok := o.Constant.Map["post"]
if ok {
pattern := "^" + r.ReplaceAllString(post.Source, "[a-zA-Z0-9]*") + "$"
patternToRegexp[post.Source] = pattern
}
put, ok := o.Constant.Map["put"]
if ok {
pattern := "^" + r.ReplaceAllString(put.Source, "[a-zA-Z0-9]*") + "$"
patternToRegexp[put.Source] = pattern
}
}
}

func isDir(name string) (bool, error) {
fi, err := os.Stat(name)
if err != nil {
return false, err
}
switch mode := fi.Mode(); {
case mode.IsDir():
return true, nil
default:
return false, nil
}
}

var tpl = template.Must(template.New("maps").Parse(text))

const text = `
// Code generated by pogen. DO NOT EDIT.
package {{ .Pkg }}
import (
"regexp"
)
// nolint
var pathToRegexp = map[string]*regexp.Regexp{
{{range $pr := .PatternRegexp}} "{{$pr.Pattern}}": regexp.MustCompile("{{$pr.RegexPattern}}"),
{{end}}
}
func Pattern(path string)(pattern string, found bool){
for k,v := range pathToRegexp{
if v.MatchString(path){
return k, true
}
}
return "", false
}
`

func deleteIfExist(path string) error {
_, err := os.Stat(path)
if os.IsNotExist(err) {
return nil
}
return os.Remove(path)
}

0 comments on commit b9cf9f7

Please sign in to comment.