diff --git a/build.go b/build.go index 068e56e..fb7192e 100644 --- a/build.go +++ b/build.go @@ -35,6 +35,7 @@ func Build(conf *config.Config, goPath string) { fmt.Fprintln(os.Stderr, " an error occured while trying to understand your code", err) os.Exit(2) } + ts, err := RenderTypeScriptServices(services, conf.Mappings, scalarTypes, target.TypeScriptModule) if err != nil { fmt.Fprintln(os.Stderr, " could not generate ts code", err) diff --git a/config/config.go b/config/config.go index 50bc578..b34b183 100644 --- a/config/config.go +++ b/config/config.go @@ -8,7 +8,7 @@ import ( type Target struct { Package string - Services []string + Services map[string]string TypeScriptModule string `yaml:"module"` Out string } diff --git a/config/config_test.go b/config/config_test.go index c07d58e..2c47eb0 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -6,7 +6,7 @@ const sampleConf = `--- targets: demo: services: - - Service + /service/demo: Service package: github.com/foomo/gotsrpc/demo module: My.Service out: /tmp/my-service.ts @@ -56,7 +56,7 @@ func TestLoadConfig(t *testing.T) { if len(demoTarget.Services) != 1 { t.Fatal("wrong number of services") } - if demoTarget.Services[0] != "Service" { - t.Fatal("first serive is wrong") + if demoTarget.Services["/service/demo"] != "Service" { + t.Fatal("first service is wrong") } } diff --git a/go.go b/go.go index 7ed923f..8657678 100644 --- a/go.go +++ b/go.go @@ -105,7 +105,7 @@ func strfirst(str string, strfunc func(string) string) string { } -func renderServiceProxies(services []*Service, fullPackageName string, packageName string, g *code) error { +func renderServiceProxies(services map[string]*Service, fullPackageName string, packageName string, g *code) error { aliases := map[string]string{ "net/http": "http", "time": "time", @@ -290,7 +290,7 @@ func renderServiceProxies(services []*Service, fullPackageName string, packageNa return nil } -func RenderGo(services []*Service, longPackageName, packageName string) (gocode string, err error) { +func RenderGo(services map[string]*Service, longPackageName, packageName string) (gocode string, err error) { g := newCode(" ") err = renderServiceProxies(services, longPackageName, packageName, g) if err != nil { diff --git a/servicereader.go b/servicereader.go index 23ff276..9aeaea1 100644 --- a/servicereader.go +++ b/servicereader.go @@ -11,7 +11,7 @@ import ( "strings" ) -func readServiceFile(file *ast.File, packageName string, services []*Service) error { +func readServiceFile(file *ast.File, packageName string, services map[string]*Service) error { findService := func(serviceName string) (service *Service, ok bool) { for _, service := range services { if service.Name == serviceName { @@ -133,13 +133,13 @@ func readFields(fieldList *ast.FieldList, fileImports fileImportSpecMap) (fields } -func readServicesInPackage(pkg *ast.Package, packageName string, serviceNames []string) (services []*Service, err error) { - services = []*Service{} - for _, serviceName := range serviceNames { - services = append(services, &Service{ +func readServicesInPackage(pkg *ast.Package, packageName string, serviceMap map[string]string) (services map[string]*Service, err error) { + services = map[string]*Service{} + for endpoint, serviceName := range serviceMap { + services[endpoint] = &Service{ Name: serviceName, Methods: []*Method{}, - }) + } } for _, file := range pkg.Files { err = readServiceFile(file, packageName, services) @@ -182,8 +182,8 @@ func loadConstants(pkg *ast.Package) map[string]*ast.BasicLit { } -func Read(goPath string, packageName string, serviceNames []string) (services []*Service, structs map[string]*Struct, scalars map[string]*Scalar, constants map[string]map[string]*ast.BasicLit, err error) { - if len(serviceNames) == 0 { +func Read(goPath string, packageName string, serviceMap map[string]string) (services map[string]*Service, structs map[string]*Struct, scalars map[string]*Scalar, constants map[string]map[string]*ast.BasicLit, err error) { + if len(serviceMap) == 0 { err = errors.New("nothing to do service names are empty") return } @@ -191,8 +191,7 @@ func Read(goPath string, packageName string, serviceNames []string) (services [] if err != nil { return } - - services, err = readServicesInPackage(pkg, packageName, serviceNames) + services, err = readServicesInPackage(pkg, packageName, serviceMap) if err != nil { return } diff --git a/typescript.go b/typescript.go index 7bf8994..cde97c5 100644 --- a/typescript.go +++ b/typescript.go @@ -98,11 +98,11 @@ func renderStruct(str *Struct, mappings config.TypeScriptMappings, scalarTypes m return nil } -func renderService(service *Service, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, ts *code) error { +func renderService(service *Service, endpoint string, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, ts *code) error { clientName := service.Name + "Client" ts.l("export class " + clientName + " {").ind(1). l("static defaultInst = new " + clientName + ";"). - l("constructor(public endPoint:string = \"/service\", public transport = GoTSRPC.call) { }") + l("constructor(public endPoint:string = \"" + endpoint + "\", public transport = GoTSRPC.call) { }") for _, method := range service.Methods { ts.app(lcfirst(method.Name) + "(") @@ -272,7 +272,7 @@ func ucFirst(str string) string { return constPrefix } -func RenderTypeScriptServices(services []*Service, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, tsModuleName string) (typeScript string, err error) { +func RenderTypeScriptServices(services map[string]*Service, mappings config.TypeScriptMappings, scalarTypes map[string]*Scalar, tsModuleName string) (typeScript string, err error) { ts := newCode(" ") if !SkipGoTSRPC { ts.l(`module GoTSRPC { @@ -305,8 +305,8 @@ func RenderTypeScriptServices(services []*Service, mappings config.TypeScriptMap ts.l("module " + tsModuleName + " {") ts.ind(1) - for _, service := range services { - err = renderService(service, mappings, scalarTypes, ts) + for endPoint, service := range services { + err = renderService(service, endPoint, mappings, scalarTypes, ts) if err != nil { return }