@@ -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+
292315type funcTreePair struct {
293316 tree * parser.Thrift
294317 fn * parser.Function
0 commit comments