Skip to content

Commit

Permalink
support: RegisterGO
Browse files Browse the repository at this point in the history
  • Loading branch information
yc90s committed Mar 8, 2024
1 parent 6056aff commit a95c5ea
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 14 deletions.
6 changes: 3 additions & 3 deletions cmd/xrpc/examples/hello.service
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package main

service HelloService {
Hello(string) (string, error)
go Hello(string) (string, error)
Add(*string, int) (*string, error)
}

service WorldService {
Hi()
Sum() (int, error)
}
go Sum() (int, error)
}
69 changes: 69 additions & 0 deletions cmd/xrpc/examples/hello.service.go

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

39 changes: 39 additions & 0 deletions cmd/xrpc/examples/world.service.go

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

20 changes: 14 additions & 6 deletions cmd/xrpc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,24 @@ type I{{$m.Name}} interface {
func Register{{$m.Name}}Server(rpc *xrpc.RPCServer, s I{{$m.Name}}) {
{{- range $_, $method := $m.Methods }}
rpc.Register("{{$method.Name}}", s.{{$method.Name}})
{{- if $method.IsGo }}
rpc.RegisterGO("{{$method.Name}}", s.{{$method.Name}})
{{- else }}
rpc.Register("{{$method.Name}}", s.{{$method.Name}})
{{- end }}
{{- end}}
}
type {{$m.Name}}Client struct {
*xrpc.RPCClient
c xrpc.IRPCClient
}
func New{{$m.Name}}Client(c *xrpc.RPCClient) *{{$m.Name}}Client {
return &{{$m.Name}}Client{c}
func New{{$m.Name}}Client(c xrpc.IRPCClient) *{{$m.Name}}Client {
return &{{$m.Name}}Client{c: c}
}
func (c *{{$m.Name}}Client) Close() {
c.c.Close()
}
{{range $_, $method := $m.Methods}}
func (c *{{$m.Name}}Client) {{$method.Name}}(subj string
Expand All @@ -64,7 +72,7 @@ func (c *{{$m.Name}}Client) {{$method.Name}}(subj string
{{- if len $method.Returns }}
var reply {{decayReply (getReply $method.Returns)}}
err := c.Call(subj, "{{$method.Name}}", &reply
err := c.c.Call(subj, "{{$method.Name}}", &reply
{{- range $index, $arg := $method.Args -}}
, arg{{$index}}
{{- end -}})
Expand All @@ -75,7 +83,7 @@ func (c *{{$m.Name}}Client) {{$method.Name}}(subj string
{{- end}}
{{- else}}
err := c.Cast(subj, "{{$method.Name}}"
err := c.c.Cast(subj, "{{$method.Name}}"
{{- range $index, $arg := $method.Args -}}
, arg{{$index}}
{{- end -}})
Expand Down
21 changes: 16 additions & 5 deletions cmd/xrpc/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type MethodAST struct {
Name string
Args []string
Returns []string
IsGo bool
}

func (s *ServiceAST) String() string {
Expand All @@ -33,15 +34,15 @@ func (s *ServiceAST) String() string {
}

func (m *MethodAST) String() string {
return fmt.Sprintf("MethodAST(name=%s, args=%v, returns=%v)", m.Name, m.Args, m.Returns)
return fmt.Sprintf("MethodAST(name=%s, args=%v, returns=%v, isgo=)", m.Name, m.Args, m.Returns, m.IsGo)
}

// Grammar rule:
// package: package ID (import PATH)* serviceList
// serviceList: service | service serviceList
// service: SERVICE ID LCURLY serviceMethodList RCURLY
// serviceMethodList: serviceMethodDecl serviceMethodList | serviceMethodDecl
// serviceMethodDecl: ID LPAREN formalParametersList RPAREN returnValue
// serviceMethodDecl: (GO)+ ID LPAREN formalParametersList RPAREN returnValue
// parametersList: parameter
// | parameter COMMA parametersList
// | empty
Expand Down Expand Up @@ -70,11 +71,12 @@ func NewServiceAST(name string, methods []*MethodAST) *ServiceAST {
}
}

func NewMethodAST(name string, args, returns []string) *MethodAST {
func NewMethodAST(name string, args, returns []string, isGo bool) *MethodAST {
return &MethodAST{
Name: name,
Args: args,
Returns: returns,
IsGo: isGo,
}
}

Expand Down Expand Up @@ -201,7 +203,7 @@ func (p *Parser) serviceMethodList() ([]*MethodAST, error) {
}
methods = append(methods, method)

for p.currentToken.tp == ID {
for p.currentToken.tp == ID || p.currentToken.tp == GO {
method, err := p.serviceMethodDecl()
if err != nil {
return nil, err
Expand All @@ -213,6 +215,15 @@ func (p *Parser) serviceMethodList() ([]*MethodAST, error) {
}

func (p *Parser) serviceMethodDecl() (*MethodAST, error) {
isGo := false
if p.currentToken.tp == GO {
err := p.eat(GO)
if err != nil {
return nil, err
}
isGo = true
}

methodName := p.currentToken.value
err := p.eat(ID)
if err != nil {
Expand All @@ -239,7 +250,7 @@ func (p *Parser) serviceMethodDecl() (*MethodAST, error) {
return nil, err
}

return NewMethodAST(methodName, args, returns), nil
return NewMethodAST(methodName, args, returns, isGo), nil
}

func (p *Parser) formalParametersList() ([]string, error) {
Expand Down
2 changes: 2 additions & 0 deletions cmd/xrpc/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const (
SERVICE = "service"
PACKAGE = "package"
IMPORT = "import"
GO = "go"

ID = "ID"
PATH = "PATH"
Expand All @@ -22,6 +23,7 @@ var RESERVE_KEYWORDS = map[string]string{
SERVICE: SERVICE,
PACKAGE: PACKAGE,
IMPORT: IMPORT,
GO: GO,
}

var SINGLE_CHAR_TOKENS = map[string]string{
Expand Down

0 comments on commit a95c5ea

Please sign in to comment.