feat: support interface scalar type

This commit is contained in:
franklin 2021-04-09 13:03:50 +02:00
parent e6d91c034e
commit 5ae8698afd
22 changed files with 141 additions and 56 deletions

View File

@ -2,8 +2,10 @@
generate:
rm -vf demo/output/*
rm -vf demo/output-commonjs/*
rm -vf demo/output-commonjs-async/*
go run cmd/gotsrpc/gotsrpc.go demo/config.yml
go run cmd/gotsrpc/gotsrpc.go -skipgotsrpc demo/config-commonjs.yml
go run cmd/gotsrpc/gotsrpc.go -skipgotsrpc demo/config-commonjs-async.yml
tsc --outFile cmd/demo/demo.js demo/demo.ts
.PHONY: demo
@ -14,7 +16,10 @@ demo: generate
install:
go install cmd/gotsrpc/gotsrpc.go
install.debug:
go install -gcflags "all=-N -l" cmd/gotsrpc/gotsrpc.go
.PHONY: test
test:
go test -v ./...

View File

@ -114,7 +114,7 @@ func Build(conf *config.Config, goPath string) {
goPaths = append(goPaths, vendorDirectory)
}
services, structs, scalarTypes, constants, err := Read(goPaths, conf.Module, longPackageName, target.Services)
pkgName, services, structs, scalars, constants, err := Read(goPaths, conf.Module, packageName, target.Services)
if err != nil {
fmt.Fprintln(os.Stderr, "\t an error occured while trying to understand your code: ", err)
@ -123,7 +123,7 @@ func Build(conf *config.Config, goPath string) {
if target.Out != "" {
ts, err := RenderTypeScriptServices(conf.ModuleKind, conf.TSClientFlavor, services, conf.Mappings, scalarTypes, structs, target)
ts, err := RenderTypeScriptServices(conf.ModuleKind, conf.TSClientFlavor, services, conf.Mappings, scalars, structs, target)
if err != nil {
fmt.Fprintln(os.Stderr, " could not generate ts code", err)
os.Exit(3)
@ -142,7 +142,7 @@ func Build(conf *config.Config, goPath string) {
os.Exit(3)
}
err = renderTypescriptStructsToPackages(conf.ModuleKind, structs, conf.Mappings, constants, scalarTypes, mappedTypeScript)
err = renderTypescriptStructsToPackages(conf.ModuleKind, structs, conf.Mappings, constants, scalars, mappedTypeScript)
if err != nil {
fmt.Fprintln(os.Stderr, "struct gen err for target", name, err)
os.Exit(4)

View File

@ -51,6 +51,9 @@ var GoTSRPC;
this.endPoint = endPoint;
this.transport = transport;
}
DemoClient.prototype.any = function (any, anyList, anyMap, success, err) {
this.transport(this.endPoint, "Any", [any, anyList, anyMap], success, err);
};
DemoClient.prototype.extractAddress = function (person, success, err) {
this.transport(this.endPoint, "ExtractAddress", [person], success, err);
};

View File

@ -1,6 +1,7 @@
package demo
import nstd "github.com/foomo/gotsrpc/demo/nested"
//go:generate codecgen -o values.generated.go demo_complex.go
type Address struct {
@ -32,7 +33,6 @@ type Person struct {
DNA []byte
}
func (d *Demo) ExtractAddress(person *Person) (addr *Address, e *Err) {
if person == nil {
return nil, nil
@ -55,6 +55,10 @@ func (d *Demo) Nest() []*nstd.Nested {
return nil
}
func (d *Demo) Any(any nstd.Any, anyList []nstd.Any, anyMap map[string]nstd.Any) (nstd.Any, []nstd.Any, map[string]nstd.Any) {
return nil, nil, nil
}
func (d *Demo) GiveMeAScalar() (amount nstd.Amount, wahr nstd.True, hier ScalarInPlace) {
//func (s *Service) giveMeAScalar() (amount nstd.Amount, wahr nstd.True, hier ScalarInPlace) {
return nstd.Amount(10), nstd.ItIsTrue, ScalarInPlace("hier")

View File

@ -100,6 +100,17 @@ type (
callStatsHandler gotsrpc.GoRPCCallStatsHandlerFun
}
DemoAnyRequest struct {
Any github_com_foomo_gotsrpc_demo_nested.Any
AnyList []github_com_foomo_gotsrpc_demo_nested.Any
AnyMap map[string]github_com_foomo_gotsrpc_demo_nested.Any
}
DemoAnyResponse struct {
RetAny_0 github_com_foomo_gotsrpc_demo_nested.Any
RetAny_1 []github_com_foomo_gotsrpc_demo_nested.Any
RetAny_2 map[string]github_com_foomo_gotsrpc_demo_nested.Any
}
DemoExtractAddressRequest struct {
Person *Person
}
@ -165,6 +176,8 @@ type (
)
func init() {
gob.Register(DemoAnyRequest{})
gob.Register(DemoAnyResponse{})
gob.Register(DemoExtractAddressRequest{})
gob.Register(DemoExtractAddressResponse{})
gob.Register(DemoGiveMeAScalarRequest{})
@ -223,6 +236,10 @@ func (p *DemoGoRPCProxy) handler(clientAddr string, request interface{}) (respon
funcName := funcNameParts[len(funcNameParts)-1]
switch funcName {
case "DemoAnyRequest":
req := request.(DemoAnyRequest)
retAny_0, retAny_1, retAny_2 := p.service.Any(req.Any, req.AnyList, req.AnyMap)
response = DemoAnyResponse{RetAny_0: retAny_0, RetAny_1: retAny_1, RetAny_2: retAny_2}
case "DemoExtractAddressRequest":
req := request.(DemoExtractAddressRequest)
addr, e := p.service.ExtractAddress(req.Person)

View File

@ -64,6 +64,17 @@ func (tsc *DemoGoRPCClient) Stop() {
tsc.Client.Stop()
}
func (tsc *DemoGoRPCClient) Any(any github_com_foomo_gotsrpc_demo_nested.Any, anyList []github_com_foomo_gotsrpc_demo_nested.Any, anyMap map[string]github_com_foomo_gotsrpc_demo_nested.Any) (retAny_0 github_com_foomo_gotsrpc_demo_nested.Any, retAny_1 []github_com_foomo_gotsrpc_demo_nested.Any, retAny_2 map[string]github_com_foomo_gotsrpc_demo_nested.Any, clientErr error) {
req := DemoAnyRequest{Any: any, AnyList: anyList, AnyMap: anyMap}
rpcCallRes, rpcCallErr := tsc.Client.Call(req)
if rpcCallErr != nil {
clientErr = rpcCallErr
return
}
response := rpcCallRes.(DemoAnyResponse)
return response.RetAny_0, response.RetAny_1, response.RetAny_2, nil
}
func (tsc *DemoGoRPCClient) ExtractAddress(person *Person) (addr *Address, e *Err, clientErr error) {
req := DemoExtractAddressRequest{Person: person}
rpcCallRes, rpcCallErr := tsc.Client.Call(req)

View File

@ -9,6 +9,7 @@ import (
time "time"
gotsrpc "github.com/foomo/gotsrpc"
github_com_foomo_gotsrpc_demo_nested "github.com/foomo/gotsrpc/demo/nested"
)
type FooGoTSRPCProxy struct {
@ -130,6 +131,25 @@ func (p *DemoGoTSRPCProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
callStats.Service = "Demo"
}
switch funcName {
case "Any":
var (
arg_any github_com_foomo_gotsrpc_demo_nested.Any
arg_anyList []github_com_foomo_gotsrpc_demo_nested.Any
arg_anyMap map[string]github_com_foomo_gotsrpc_demo_nested.Any
)
args = []interface{}{&arg_any, &arg_anyList, &arg_anyMap}
err := gotsrpc.LoadArgs(&args, callStats, r)
if err != nil {
gotsrpc.ErrorCouldNotLoadArgs(w)
return
}
executionStart := time.Now()
anyRet, anyRet_1, anyRet_2 := p.service.Any(arg_any, arg_anyList, arg_anyMap)
if callStats != nil {
callStats.Execution = time.Now().Sub(executionStart)
}
gotsrpc.Reply([]interface{}{anyRet, anyRet_1, anyRet_2}, callStats, r, w)
return
case "ExtractAddress":
var (
arg_person *Person

View File

@ -42,6 +42,7 @@ func (tsc *HTTPFooGoTSRPCClient) Hello(number int64) (retHello_0 int, clientErr
}
type DemoGoTSRPCClient interface {
Any(any github_com_foomo_gotsrpc_demo_nested.Any, anyList []github_com_foomo_gotsrpc_demo_nested.Any, anyMap map[string]github_com_foomo_gotsrpc_demo_nested.Any) (retAny_0 github_com_foomo_gotsrpc_demo_nested.Any, retAny_1 []github_com_foomo_gotsrpc_demo_nested.Any, retAny_2 map[string]github_com_foomo_gotsrpc_demo_nested.Any, clientErr error)
ExtractAddress(person *Person) (addr *Address, e *Err, clientErr error)
GiveMeAScalar() (amount github_com_foomo_gotsrpc_demo_nested.Amount, wahr github_com_foomo_gotsrpc_demo_nested.True, hier ScalarInPlace, clientErr error)
Hello(name string) (retHello_0 string, retHello_1 *Err, clientErr error)
@ -74,6 +75,13 @@ func NewDemoGoTSRPCClientWithClient(url string, endpoint string, client *net_htt
Client: gotsrpc.NewClientWithHttpClient(client),
}
}
func (tsc *HTTPDemoGoTSRPCClient) Any(any github_com_foomo_gotsrpc_demo_nested.Any, anyList []github_com_foomo_gotsrpc_demo_nested.Any, anyMap map[string]github_com_foomo_gotsrpc_demo_nested.Any) (retAny_0 github_com_foomo_gotsrpc_demo_nested.Any, retAny_1 []github_com_foomo_gotsrpc_demo_nested.Any, retAny_2 map[string]github_com_foomo_gotsrpc_demo_nested.Any, clientErr error) {
args := []interface{}{any, anyList, anyMap}
reply := []interface{}{&retAny_0, &retAny_1, &retAny_2}
clientErr = tsc.Client.Call(tsc.URL, tsc.EndPoint, "Any", args, reply)
return
}
func (tsc *HTTPDemoGoTSRPCClient) ExtractAddress(person *Person) (addr *Address, e *Err, clientErr error) {
args := []interface{}{person}
reply := []interface{}{&addr, &e}

View File

@ -2,6 +2,9 @@ package nested
type Nested struct {
Name string
Any Any
AnyMap map[string]Any
AnyList []Any
SuperNestedString struct {
Ha int64
}
@ -10,6 +13,7 @@ type Nested struct {
}
}
type Any interface{}
type Amount int
type True bool

View File

@ -17,6 +17,11 @@ export class DemoClient {
constructor(
public transport:<T>(method: string, data?: any[]) => Promise<T>
) {}
async any(any:any, anyList:any[], anyMap:{[index:string]:any}):Promise<{ret:any; ret_1:any[]; ret_2:{[index:string]:any}}> {
let response = await this.transport<{0:any; 1:any[]; 2:{[index:string]:any}}>("Any", [any, anyList, anyMap])
let responseObject = {ret : response[0], ret_1 : response[1], ret_2 : response[2]};
return responseObject;
}
async extractAddress(person:github_com_foomo_gotsrpc_demo.Person):Promise<github_com_foomo_gotsrpc_demo.Address> {
let response = await this.transport<{0:github_com_foomo_gotsrpc_demo.Address; 1:github_com_foomo_gotsrpc_demo.Err}>("ExtractAddress", [person])
let err = response[1];

View File

@ -5,6 +5,9 @@ import * as github_com_foomo_gotsrpc_demo_nested from './demo-nested'; // demo/o
// github.com/foomo/gotsrpc/demo/nested.Nested
export interface Nested {
Name:string;
Any:any;
AnyMap:{[index:string]:any};
AnyList:any[];
SuperNestedString:{
Ha:number;
};

View File

@ -11,6 +11,9 @@ export class FooClient {
}
export class DemoClient {
constructor(public endPoint:string = "/service/demo", public transport:(endPoint:string, method:string, args:any[], success:any, err:any) => void) { }
any(any:any, anyList:any[], anyMap:{[index:string]:any}, success:(ret:any, ret_1:any[], ret_2:{[index:string]:any}) => void, err:(request:XMLHttpRequest, e?:Error) => void) {
this.transport(this.endPoint, "Any", [any, anyList, anyMap], success, err);
}
extractAddress(person:github_com_foomo_gotsrpc_demo.Person, success:(addr:github_com_foomo_gotsrpc_demo.Address, e:github_com_foomo_gotsrpc_demo.Err) => void, err:(request:XMLHttpRequest, e?:Error) => void) {
this.transport(this.endPoint, "ExtractAddress", [person], success, err);
}

View File

@ -5,6 +5,9 @@ import * as github_com_foomo_gotsrpc_demo_nested from './demo-nested'; // demo/o
// github.com/foomo/gotsrpc/demo/nested.Nested
export interface Nested {
Name:string;
Any:any;
AnyMap:{[index:string]:any};
AnyList:any[];
SuperNestedString:{
Ha:number;
};

View File

@ -36,6 +36,9 @@ module GoTSRPC.Demo {
export class DemoClient {
static defaultInst = new DemoClient;
constructor(public endPoint:string = "/service/demo", public transport = GoTSRPC.call) { }
any(any:any, anyList:any[], anyMap:{[index:string]:any}, success:(ret:any, ret_1:any[], ret_2:{[index:string]:any}) => void, err:(request:XMLHttpRequest, e?:Error) => void) {
this.transport(this.endPoint, "Any", [any, anyList, anyMap], success, err);
}
extractAddress(person:GoTSRPC.Demo.Person, success:(addr:GoTSRPC.Demo.Address, e:GoTSRPC.Demo.Err) => void, err:(request:XMLHttpRequest, e?:Error) => void) {
this.transport(this.endPoint, "ExtractAddress", [person], success, err);
}

View File

@ -3,6 +3,9 @@ module GoTSRPC.Demo.Nested {
// github.com/foomo/gotsrpc/demo/nested.Nested
export interface Nested {
Name:string;
Any:any;
AnyMap:{[index:string]:any};
AnyList:any[];
SuperNestedString:{
Ha:number;
};

16
go.sum
View File

@ -1,8 +1,6 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@ -13,7 +11,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA=
github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -31,7 +28,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
@ -43,7 +39,6 @@ github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@ -56,7 +51,6 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
@ -70,7 +64,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@ -95,9 +88,7 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@ -110,7 +101,6 @@ github.com/valyala/gorpc v0.0.0-20160519171614-908281bef774/go.mod h1:8uNqM1i7pr
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -133,9 +123,7 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -143,7 +131,6 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d h1:MiWWjyhUzZ+jvhZvloX6ZrUsdEghn8a64Upd8EMHglE=
@ -159,7 +146,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
golang.org/x/tools v0.0.0-20210105210202-9ed45478a130 h1:8qSBr5nyKsEgkP918Pu5FFDZpTtLIjXSo6mrtdVOFfk=
golang.org/x/tools v0.0.0-20210105210202-9ed45478a130/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
@ -182,13 +168,11 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

View File

@ -3,11 +3,12 @@ package gotsrpc
type ScalarType string
const (
ScalarTypeString ScalarType = "string"
ScalarTypeByte ScalarType = "byte"
ScalarTypeNumber ScalarType = "number"
ScalarTypeBool ScalarType = "bool"
ScalarTypeNone ScalarType = ""
ScalarTypeString ScalarType = "string"
ScalarTypeInterface ScalarType = "any"
ScalarTypeByte ScalarType = "byte"
ScalarTypeNumber ScalarType = "number"
ScalarTypeBool ScalarType = "bool"
ScalarTypeNone ScalarType = ""
)
type JSONInfo struct {

View File

@ -292,7 +292,6 @@ func Read(
return
}
constants[structPackage] = loadConstants(pkg)
}
}
}
@ -443,10 +442,10 @@ func typesPending(structs map[string]*Struct, scalars map[string]*Scalar, missin
return false
}
func (s *Struct) DepsSatisfied(missingTypes map[string]bool, structs map[string]*Struct, scalarTypes map[string]*Scalar) bool {
func (s *Struct) DepsSatisfied(missingTypes map[string]bool, structs map[string]*Struct, scalars map[string]*Scalar) bool {
needsWork := func(fullName string) bool {
strct, strctOK := structs[fullName]
scalar, scalarOK := scalarTypes[fullName]
scalar, scalarOK := scalars[fullName]
if !strctOK && !scalarOK {
// hey there is more todo
missingTypes[fullName] = true

View File

@ -7,18 +7,18 @@ import (
"reflect"
"strings"
yaml "gopkg.in/yaml.v2"
"gopkg.in/yaml.v2"
)
var ReaderTrace = false
func readStructs(pkg *ast.Package, packageName string) (structs map[string]*Struct, scalarTypes map[string]*Scalar, err error) {
func readStructs(pkg *ast.Package, packageName string) (structs map[string]*Struct, scalars map[string]*Scalar, err error) {
structs = map[string]*Struct{}
trace("reading files in package", packageName)
scalarTypes = map[string]*Scalar{}
scalars = map[string]*Scalar{}
errorTypes := map[string]bool{}
for _, file := range pkg.Files {
err = extractTypes(file, packageName, structs, scalarTypes)
err = extractTypes(file, packageName, structs, scalars)
if err != nil {
return
}
@ -103,6 +103,8 @@ func extractJSONInfo(tag string) *JSONInfo {
func getScalarFromAstIdent(ident *ast.Ident) ScalarType {
switch ident.Name {
case "interface":
return ScalarTypeInterface
case "string":
return ScalarTypeString
case "bool":
@ -355,7 +357,7 @@ func extractErrorTypes(file *ast.File, packageName string, errorTypes map[string
return
}
func extractTypes(file *ast.File, packageName string, structs map[string]*Struct, scalarTypes map[string]*Scalar) error {
func extractTypes(file *ast.File, packageName string, structs map[string]*Struct, scalars map[string]*Scalar) error {
fileImports := getFileImports(file, packageName)
for name, obj := range file.Scope.Objects {
if obj.Kind == ast.Typ && obj.Decl != nil {
@ -375,10 +377,17 @@ func extractTypes(file *ast.File, packageName string, structs map[string]*Struct
structType := typeSpec.Type.(*ast.StructType)
trace("StructType", obj.Name)
structs[structName].Fields = readFieldList(structType.Fields.List, fileImports)
case "*ast.InterfaceType":
trace("Interface", obj.Name)
scalars[structName] = &Scalar{
Name: structName,
Package: packageName,
Type: ScalarTypeInterface,
}
case "*ast.Ident":
trace("Scalar", obj.Name)
scalarIdent := typeSpec.Type.(*ast.Ident)
scalarTypes[structName] = &Scalar{
scalars[structName] = &Scalar{
Name: structName,
Package: packageName,
Type: getScalarFromAstIdent(scalarIdent),

View File

@ -23,14 +23,14 @@ func (f *Field) tsName() string {
return n
}
func (v *Value) tsType(mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, ts *code) {
func (v *Value) tsType(mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, ts *code) {
switch true {
case v.Map != nil:
ts.app("{[index:" + v.Map.KeyType + "]:")
v.Map.Value.tsType(mappings, scalarTypes, structs, ts)
v.Map.Value.tsType(mappings, scalars, structs, ts)
ts.app("}")
case v.Array != nil:
v.Array.Value.tsType(mappings, scalarTypes, structs, ts)
v.Array.Value.tsType(mappings, scalars, structs, ts)
if v.Array.Value.ScalarType != ScalarTypeByte {
ts.app("[]")
}
@ -45,7 +45,7 @@ func (v *Value) tsType(mappings config.TypeScriptMappings, scalarTypes map[strin
}
scalarName := v.StructType.FullName()
// is it a hidden scalar ?!
hiddenScalar, ok := scalarTypes[scalarName]
hiddenScalar, ok := scalars[scalarName]
if ok {
ts.app(tsTypeFromScalarType(hiddenScalar.Type))
return
@ -77,7 +77,7 @@ func (v *Value) tsType(mappings config.TypeScriptMappings, scalarTypes map[strin
case v.Struct != nil:
// v.Struct.Value.tsType(mappings, ts)
ts.l("{").ind(1)
renderStructFields(v.Struct.Fields, mappings, scalarTypes, structs, ts)
renderStructFields(v.Struct.Fields, mappings, scalars, structs, ts)
ts.ind(-1).app("}")
case len(v.ScalarType) > 0:
ts.app(tsTypeFromScalarType(v.ScalarType))
@ -97,7 +97,7 @@ func tsTypeFromScalarType(scalarType ScalarType) string {
return string(scalarType)
}
func renderStructFields(fields []*Field, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, ts *code) {
func renderStructFields(fields []*Field, mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, ts *code) {
for _, f := range fields {
if f.JSONInfo != nil && f.JSONInfo.Ignore {
continue
@ -107,13 +107,13 @@ func renderStructFields(fields []*Field, mappings config.TypeScriptMappings, sca
ts.app("?")
}
ts.app(":")
f.Value.tsType(mappings, scalarTypes, structs, ts)
f.Value.tsType(mappings, scalars, structs, ts)
ts.app(";")
ts.nl()
}
}
func renderTypescriptStruct(str *Struct, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, ts *code) error {
func renderTypescriptStruct(str *Struct, mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, ts *code) error {
if str.Array != nil {
// skipping array type
return nil
@ -123,11 +123,11 @@ func renderTypescriptStruct(str *Struct, mappings config.TypeScriptMappings, sca
switch {
case str.Map != nil:
ts.app("[index:" + str.Map.KeyType + "]:")
str.Map.Value.tsType(mappings, scalarTypes, structs, ts)
str.Map.Value.tsType(mappings, scalars, structs, ts)
ts.app(";")
ts.nl()
default:
renderStructFields(str.Fields, mappings, scalarTypes, structs, ts)
renderStructFields(str.Fields, mappings, scalars, structs, ts)
}
ts.ind(-1).l("}")
return nil
@ -247,7 +247,7 @@ func ucFirst(str string) string {
return constPrefix
}
func RenderTypeScriptServices(moduleKind config.ModuleKind, tsClientFlavor config.TSClientFlavor, services ServiceList, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, target *config.Target) (typeScript string, err error) {
func RenderTypeScriptServices(moduleKind config.ModuleKind, tsClientFlavor config.TSClientFlavor, services ServiceList, mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, target *config.Target) (typeScript string, err error) {
ts := newCode(" ")
if !SkipGoTSRPC && tsClientFlavor == "" {
@ -297,9 +297,9 @@ func RenderTypeScriptServices(moduleKind config.ModuleKind, tsClientFlavor confi
}
switch tsClientFlavor {
case config.TSClientFlavorAsync:
err = renderTypescriptClientAsync(service, mappings, scalarTypes, structs, ts)
err = renderTypescriptClientAsync(service, mappings, scalars, structs, ts)
default:
err = renderTypescriptClient(SkipGoTSRPC, moduleKind, service, mappings, scalarTypes, structs, ts)
err = renderTypescriptClient(SkipGoTSRPC, moduleKind, service, mappings, scalars, structs, ts)
}
if err != nil {
return

View File

@ -7,7 +7,7 @@ import (
"github.com/foomo/gotsrpc/config"
)
func renderTypescriptClient(skipGoTSRPC bool, moduleKind config.ModuleKind, service *Service, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, ts *code) error {
func renderTypescriptClient(skipGoTSRPC bool, moduleKind config.ModuleKind, service *Service, mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, ts *code) error {
clientName := service.Name + "Client"
ts.l("export class " + clientName + " {").ind(1)
@ -54,7 +54,7 @@ func renderTypescriptClient(skipGoTSRPC bool, moduleKind config.ModuleKind, serv
ts.app(", ")
}
ts.app(arg.tsName() + ":")
arg.Value.tsType(mappings, scalarTypes, structs, ts)
arg.Value.tsType(mappings, scalars, structs, ts)
callArgs = append(callArgs, arg.Name)
argCount++
}
@ -76,7 +76,7 @@ func renderTypescriptClient(skipGoTSRPC bool, moduleKind config.ModuleKind, serv
ts.app(", ")
}
ts.app(retArgName + ":")
retField.Value.tsType(mappings, scalarTypes, structs, ts)
retField.Value.tsType(mappings, scalars, structs, ts)
}
ts.app(") => void")

View File

@ -8,7 +8,7 @@ import (
"github.com/foomo/gotsrpc/config"
)
func renderTypescriptClientAsync(service *Service, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, structs map[string]*Struct, ts *code) error {
func renderTypescriptClientAsync(service *Service, mappings config.TypeScriptMappings, scalars map[string]*Scalar, structs map[string]*Struct, ts *code) error {
clientName := service.Name + "Client"
ts.l("export class " + clientName + " {")
@ -48,7 +48,7 @@ func renderTypescriptClientAsync(service *Service, mappings config.TypeScriptMap
ts.app(", ")
}
ts.app(arg.tsName() + ":")
arg.Value.tsType(mappings, scalarTypes, structs, ts)
arg.Value.tsType(mappings, scalars, structs, ts)
callArgs = append(callArgs, arg.Name)
argCount++
}
@ -85,7 +85,7 @@ func renderTypescriptClientAsync(service *Service, mappings config.TypeScriptMap
}
innerReturnTypeTS.app(strconv.Itoa(index) + ":")
retField.Value.tsType(mappings, scalarTypes, structs, innerReturnTypeTS)
retField.Value.tsType(mappings, scalars, structs, innerReturnTypeTS)
if index == len(method.Return)-1 && retField.Value.IsError {
throwLastError = true
@ -94,14 +94,14 @@ func renderTypescriptClientAsync(service *Service, mappings config.TypeScriptMap
} else {
if index == 0 {
firstReturnTypeTS := newCode(" ")
retField.Value.tsType(mappings, scalarTypes, structs, firstReturnTypeTS)
retField.Value.tsType(mappings, scalars, structs, firstReturnTypeTS)
firstReturnType = firstReturnTypeTS.string()
//firstReturnFieldName = retArgName
}
countReturns++
returnTypeTS.app(retArgName + ":")
responseObject += responseObjectPrefix + retArgName + " : response[" + strconv.Itoa(index) + "]"
retField.Value.tsType(mappings, scalarTypes, structs, returnTypeTS)
retField.Value.tsType(mappings, scalars, structs, returnTypeTS)
}
responseObjectPrefix = ", "
}