Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.8, 0.10.0
-
None
-
Ubuntu 14.04 LTS (perl 5.18.2) with thrift 0.10.0
Description
I made a very simple example which I will attach, however in a nutshell if I define a structure in one thrift file like this:
ForeignInfo.thrift:
namespace perl org.fiction.rpc struct ForeignInfo { 1: string someData }
Then I define a service in another namespace like this:
SomeService.thrift:
namespace perl org.real include "ForeignInfo.thrift" service Company { ForeignInfo.ForeignInfo getForeignInfoList(); }
Then I compile both of them, the resulting generated perl code in gen-perl/org/real/Company.pm has the following use clauses in it:
require 5.6.0; use strict; use warnings; use Thrift; use org::real::Types;
Later on in the file we have:
SWITCH: for($fid) { /^0$/ && do{ if ($ftype == TType::STRUCT) { $self->{success} = new org::fiction::rpc::ForeignInfo(); $xfer += $self->{success}->read($input); } else { $xfer += $input->skip($ftype); } last; }; $xfer += $input->skip($ftype); }
If you put a simple wrapper around this call, the client gets an exception:
Undefined subroutine &org::fiction::rpc::ForeignInfo called at gen-perl/org/real/Company.pm line 98
Line 98 is where org::fiction::rpc::ForeignInfo is mentioned. Without a use clause for the Types defined by the include it cannot be used.
If I add this line to the generated code in Company.pm:
use org::fiction::rpc::Types;
Then everything works.