diff --git a/cmd/xrpc/examples/hello.service b/cmd/xrpc/examples/hello.service index 8649621..6eb861b 100644 --- a/cmd/xrpc/examples/hello.service +++ b/cmd/xrpc/examples/hello.service @@ -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) -} \ No newline at end of file + go Sum() (int, error) +} diff --git a/cmd/xrpc/examples/hello.service.go b/cmd/xrpc/examples/hello.service.go new file mode 100644 index 0000000..2b9afc7 --- /dev/null +++ b/cmd/xrpc/examples/hello.service.go @@ -0,0 +1,69 @@ +// Code generated by xrpc. DO NOT EDIT. +package main + +import "github.com/yc90s/xrpc" + + +type IHelloService interface { + Hello(string) (string, error) + Add(*string, int) (*string, error) +} + +func RegisterHelloServiceServer(rpc *xrpc.RPCServer, s IHelloService) { + rpc.RegisterGO("Hello", s.Hello) + rpc.Register("Add", s.Add) +} + +type HelloServiceClient struct { + c xrpc.IRPCClient +} + +func NewHelloServiceClient(c xrpc.IRPCClient) *HelloServiceClient { + return &HelloServiceClient{c: c} +} + +func (c *HelloServiceClient) Close() { + c.c.Close() +} + +func (c *HelloServiceClient) Hello(subj string, arg0 string) (string, error) { + var reply string + err := c.c.Call(subj, "Hello", &reply, arg0) + return reply, err +} +func (c *HelloServiceClient) Add(subj string, arg0 *string, arg1 int) (*string, error) { + var reply string + err := c.c.Call(subj, "Add", &reply, arg0, arg1) + return &reply, err +} +type IWorldService interface { + Hi() + Sum() (int, error) +} + +func RegisterWorldServiceServer(rpc *xrpc.RPCServer, s IWorldService) { + rpc.Register("Hi", s.Hi) + rpc.RegisterGO("Sum", s.Sum) +} + +type WorldServiceClient struct { + c xrpc.IRPCClient +} + +func NewWorldServiceClient(c xrpc.IRPCClient) *WorldServiceClient { + return &WorldServiceClient{c: c} +} + +func (c *WorldServiceClient) Close() { + c.c.Close() +} + +func (c *WorldServiceClient) Hi(subj string) error { + err := c.c.Cast(subj, "Hi") + return err +} +func (c *WorldServiceClient) Sum(subj string) (int, error) { + var reply int + err := c.c.Call(subj, "Sum", &reply) + return reply, err +} \ No newline at end of file diff --git a/cmd/xrpc/examples/world.service.go b/cmd/xrpc/examples/world.service.go new file mode 100644 index 0000000..cb4a79e --- /dev/null +++ b/cmd/xrpc/examples/world.service.go @@ -0,0 +1,39 @@ +// Code generated by xrpc. DO NOT EDIT. +package main + +import "github.com/yc90s/xrpc" +import "github.com/yc90s/xrpc/examples/protobuf/pb" + + +type IHelloPbService interface { + Hello(*pb.String) (*pb.String, error) + Add(*pb.String, *pb.String) (*pb.String, error) +} + +func RegisterHelloPbServiceServer(rpc *xrpc.RPCServer, s IHelloPbService) { + rpc.Register("Hello", s.Hello) + rpc.Register("Add", s.Add) +} + +type HelloPbServiceClient struct { + c xrpc.IRPCClient +} + +func NewHelloPbServiceClient(c xrpc.IRPCClient) *HelloPbServiceClient { + return &HelloPbServiceClient{c: c} +} + +func (c *HelloPbServiceClient) Close() { + c.c.Close() +} + +func (c *HelloPbServiceClient) Hello(subj string, arg0 *pb.String) (*pb.String, error) { + var reply pb.String + err := c.c.Call(subj, "Hello", &reply, arg0) + return &reply, err +} +func (c *HelloPbServiceClient) Add(subj string, arg0 *pb.String, arg1 *pb.String) (*pb.String, error) { + var reply pb.String + err := c.c.Call(subj, "Add", &reply, arg0, arg1) + return &reply, err +} \ No newline at end of file diff --git a/cmd/xrpc/main.go b/cmd/xrpc/main.go index f5dc5f7..39c0819 100644 --- a/cmd/xrpc/main.go +++ b/cmd/xrpc/main.go @@ -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 @@ -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 -}}) @@ -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 -}}) diff --git a/cmd/xrpc/parser.go b/cmd/xrpc/parser.go index f809939..a40d743 100644 --- a/cmd/xrpc/parser.go +++ b/cmd/xrpc/parser.go @@ -22,6 +22,7 @@ type MethodAST struct { Name string Args []string Returns []string + IsGo bool } func (s *ServiceAST) String() string { @@ -33,7 +34,7 @@ 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: @@ -41,7 +42,7 @@ func (m *MethodAST) String() string { // 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 @@ -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, } } @@ -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 @@ -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 { @@ -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) { diff --git a/cmd/xrpc/token.go b/cmd/xrpc/token.go index 59721d1..9d01cd6 100644 --- a/cmd/xrpc/token.go +++ b/cmd/xrpc/token.go @@ -12,6 +12,7 @@ const ( SERVICE = "service" PACKAGE = "package" IMPORT = "import" + GO = "go" ID = "ID" PATH = "PATH" @@ -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{