Skip to content

Commit d58b94f

Browse files
authored
feat(idl): support specifying idl service name to be parsed (#85)
feat: support specifying idl service name to be parsed
1 parent d8a885f commit d58b94f

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

thrift/idl.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ type Options struct {
5252
// ParseServiceMode indicates how to parse service.
5353
ParseServiceMode meta.ParseServiceMode
5454

55+
// ServiceName indicates which idl service to be parsed.
56+
ServiceName string
57+
5558
// MapFieldWay indicates StructDescriptor.FieldByKey() uses alias to map field.
5659
// By default, we use alias to map, and alias always equals to field name if not given.
5760
MapFieldWay meta.MapFieldWay
@@ -247,15 +250,26 @@ func parse(ctx context.Context, tree *parser.Thrift, mode meta.ParseServiceMode,
247250

248251
// support one service
249252
svcs := tree.Services
250-
switch mode {
251-
case meta.LastServiceOnly:
252-
svcs = svcs[len(svcs)-1:]
253-
sDsc.name = svcs[len(svcs)-1].Name
254-
case meta.FirstServiceOnly:
255-
svcs = svcs[:1]
256-
sDsc.name = svcs[0].Name
257-
case meta.CombineServices:
258-
sDsc.name = "CombinedServices"
253+
254+
// if an idl service name is specified, it takes precedence over parse mode
255+
if opts.ServiceName != "" {
256+
var err error
257+
svcs, err = getTargetService(svcs, opts.ServiceName)
258+
if err != nil {
259+
return nil, err
260+
}
261+
sDsc.name = opts.ServiceName
262+
} else {
263+
switch mode {
264+
case meta.LastServiceOnly:
265+
svcs = svcs[len(svcs)-1:]
266+
sDsc.name = svcs[len(svcs)-1].Name
267+
case meta.FirstServiceOnly:
268+
svcs = svcs[:1]
269+
sDsc.name = svcs[0].Name
270+
case meta.CombineServices:
271+
sDsc.name = "CombinedServices"
272+
}
259273
}
260274

261275
for _, svc := range svcs {
@@ -289,6 +303,15 @@ func parse(ctx context.Context, tree *parser.Thrift, mode meta.ParseServiceMode,
289303
return sDsc, nil
290304
}
291305

306+
func getTargetService(svcs []*parser.Service, serviceName string) ([]*parser.Service, error) {
307+
for _, svc := range svcs {
308+
if svc.Name == serviceName {
309+
return []*parser.Service{svc}, nil
310+
}
311+
}
312+
return nil, fmt.Errorf("the idl service name %s is not in the idl. Please check your idl", serviceName)
313+
}
314+
292315
type funcTreePair struct {
293316
tree *parser.Thrift
294317
fn *parser.Function

thrift/idl_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,3 +437,41 @@ func TestStreamingFunctionDescriptorFromContent(t *testing.T) {
437437
require.Equal(t, "Request", dsc.Functions()["EchoClient"].Request().Struct().Name())
438438
require.Equal(t, "", dsc.Functions()["EchoUnary"].Request().Struct().Name())
439439
}
440+
441+
func TestParseWithServiceName(t *testing.T) {
442+
path := "a/b/main.thrift"
443+
content := `
444+
namespace go thrift
445+
446+
struct Request {
447+
1: required string message,
448+
}
449+
450+
struct Response {
451+
1: required string message,
452+
}
453+
454+
service Service1 {
455+
Response Test(1: Request req)
456+
}
457+
458+
service Service2 {
459+
Response Test(1: Request req)
460+
}
461+
462+
service Service3 {
463+
Response Test(1: Request req)
464+
}
465+
`
466+
467+
opts := Options{ServiceName: "Service2"}
468+
p, err := opts.NewDescritorFromContent(context.Background(), path, content, nil, false)
469+
require.Nil(t, err)
470+
require.Equal(t, p.Name(), "Service2")
471+
472+
opts = Options{ServiceName: "UnknownService"}
473+
p, err = opts.NewDescritorFromContent(context.Background(), path, content, nil, false)
474+
require.NotNil(t, err)
475+
require.Nil(t, p)
476+
require.Equal(t, err.Error(), "the idl service name UnknownService is not in the idl. Please check your idl")
477+
}

0 commit comments

Comments
 (0)