Skip to content

Commit cb17f26

Browse files
compiler/cpp/src/generate/t_go_generator: Embed the LegacyName in the Struct definition
1 parent 9b92573 commit cb17f26

File tree

3 files changed

+89
-6
lines changed

3 files changed

+89
-6
lines changed

compiler/cpp/src/generate/t_go_generator.cc

+34-5
Original file line numberDiff line numberDiff line change
@@ -1232,9 +1232,19 @@ void t_go_generator::generate_go_struct_definition(ofstream& out,
12321232
out << indent() << "}" << endl << endl;
12331233
// Default values for optional fields
12341234
out << indent() << "func (p *" << tstruct_name << ") StructDefinition() thrift.StructDefinition {" << endl;
1235-
out << indent() << " return thrift.StructDefinition{Namespace: \"" << tstruct->get_program()->get_namespace("*") << "\", Name: \"" << tstruct->get_name() << "\"}" << endl;
1235+
out << indent() << " return thrift.StructDefinition{Namespace: \"" << tstruct->get_current_name()->get_namespace() << "\", Name: \"" << tstruct->get_current_name()->get_name() << "\"}" << endl;
12361236
out << indent() << "}" << endl << endl;
12371237

1238+
out << indent() << "func (p *" << tstruct_name << ") LegacyStructDefinitions() []thrift.StructDefinition {" << endl;
1239+
out << indent() << " return []thrift.StructDefinition{" << endl;
1240+
std::vector<t_name*> legacy_names = tstruct->get_legacy_names();
1241+
for (std::vector<t_name*>::iterator it = legacy_names.begin(); it != legacy_names.end(); ++it) {
1242+
out << indent() << " {Namespace: \"" << (*it)->get_namespace() << "\", Name:\"" << (*it)->get_name() << "\"}," << endl;
1243+
}
1244+
out << indent() << " }" << endl;
1245+
out << indent() << "}" << endl << endl;
1246+
1247+
12381248
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
12391249
string publicized_name;
12401250
t_const_value* def_value;
@@ -1802,6 +1812,22 @@ void t_go_generator::generate_service_interface(t_service* tservice) {
18021812
}
18031813
}
18041814

1815+
string singletonServiceName(privatize(tservice->get_name()).append("Singleton"));
1816+
f_service_ << indent() << "type " << singletonServiceName << " struct {} " << endl << endl;
1817+
1818+
f_service_ << indent() << "func (" << singletonServiceName << ") StructDefinition() thrift.StructDefinition {" << endl;
1819+
f_service_ << indent() << " return thrift.StructDefinition{Namespace: \"" << tservice->get_current_name()->get_namespace() << "\", Name: \"" << tservice->get_current_name()->get_name() << "\"}" << endl;
1820+
f_service_ << indent() << "}" << endl << endl;
1821+
1822+
f_service_ << indent() << "func (" << singletonServiceName << ") LegacyStructDefinitions() []thrift.StructDefinition {" << endl;
1823+
f_service_ << indent() << " return []thrift.StructDefinition{" << endl;
1824+
std::vector<t_name*> legacy_names = tservice->get_legacy_names();
1825+
for (std::vector<t_name*>::iterator it = legacy_names.begin(); it != legacy_names.end(); ++it) {
1826+
f_service_ << indent() << " {Namespace: \"" << (*it)->get_namespace() << "\", Name:\"" << (*it)->get_name() << "\"}," << endl;
1827+
}
1828+
f_service_ << indent() << " }" << endl;
1829+
f_service_ << indent() << "}" << endl << endl;
1830+
18051831
f_service_ << indent() << "type " << interfaceName << " interface {" << extends_if;
18061832
indent_up();
18071833
generate_go_docstring(f_service_, tservice);
@@ -1832,6 +1858,7 @@ void t_go_generator::generate_service_client(t_service* tservice) {
18321858
string extends_client = "";
18331859
string extends_client_new = "";
18341860
string serviceName(publicize(tservice->get_name()));
1861+
string singletonServiceName(privatize(tservice->get_name()).append("Singleton"));
18351862

18361863
if (tservice->get_extends() != NULL) {
18371864
extends = type_name(tservice->get_extends());
@@ -1869,9 +1896,9 @@ void t_go_generator::generate_service_client(t_service* tservice) {
18691896
<< "Client, error) {" << endl;
18701897

18711898
indent_up();
1872-
f_service_ << indent() << "cl, err := p.Build(\""
1873-
<< tservice->get_program()->get_namespace("*") << "\", \""
1874-
<< tservice->get_name() << "\")" << endl << endl;
1899+
f_service_ << indent() << "cl, err := thrift.BuildClient(p, "
1900+
<< singletonServiceName << "{})" << endl << endl;
1901+
18751902
f_service_ << indent() << "if err != nil {" << endl;
18761903
indent_up();
18771904
f_service_ << indent() << "return nil, err" << endl;
@@ -2008,10 +2035,12 @@ void t_go_generator::generate_service_server(t_service* tservice) {
20082035
}
20092036

20102037
string pServiceName(privatize(serviceName));
2038+
string singletonServiceName(privatize(tservice->get_name()).append("Singleton"));
20112039

20122040
f_service_ << indent() << "func New" << serviceName << "ProcessorProvider(handler " << serviceName
20132041
<< ", provider thrift.TProcessorProvider) (thrift.TProcessor, error) {" << endl;
2014-
f_service_ << indent() << "p, err := provider.Build(\"" << tservice->get_program()->get_namespace("*") << "\", \"" << tservice->get_name() << "\")" << endl;
2042+
f_service_ << indent() << "p, err := thrift.BuildProcessor(provider, "
2043+
<< singletonServiceName << "{})" << endl << endl;
20152044
f_service_ << indent() << "if err != nil {" << endl;
20162045
indent_up();
20172046
f_service_ << indent() << "return nil, err" << endl;

lib/go/thrift/definition.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,18 @@ func (sd StructDefinition) CanonicalName() string {
5353
return fmt.Sprintf("%s.%s", sd.Namespace, sd.Name)
5454
}
5555

56+
type DefinedStruct interface {
57+
StructDefinition() StructDefinition
58+
}
59+
60+
type FullyDefinedStruct interface {
61+
DefinedStruct
62+
LegacyStructDefinitions() []StructDefinition
63+
}
64+
5665
type RegistrableStruct interface {
5766
TStruct
58-
StructDefinition() StructDefinition
67+
DefinedStruct
5968
}
6069

6170
func RegisterStruct(rs RegistrableStruct) {

lib/go/thrift/provider.go

+45
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,54 @@
11
package thrift
22

3+
import "errors"
4+
5+
var (
6+
ErrClientNotDefined = errors.New("client not defined")
7+
ErrProcessorNotDefined = errors.New("processor not defined")
8+
)
9+
310
type TClientProvider interface {
411
Build(string, string) (TClient, error)
512
}
613

14+
func BuildClient(cp TClientProvider, s FullyDefinedStruct) (TClient, error) {
15+
defs := append(
16+
[]StructDefinition{s.StructDefinition()},
17+
s.LegacyStructDefinitions()...,
18+
)
19+
20+
for _, def := range defs {
21+
switch cl, err := cp.Build(def.Namespace, def.Name); {
22+
case err == nil:
23+
return cl, nil
24+
case errors.Is(err, ErrClientNotDefined):
25+
default:
26+
return nil, err
27+
}
28+
}
29+
30+
return nil, ErrClientNotDefined
31+
}
32+
733
type TProcessorProvider interface {
834
Build(string, string) (TProcessor, error)
935
}
36+
37+
func BuildProcessor(pp TProcessorProvider, s FullyDefinedStruct) (TProcessor, error) {
38+
defs := append(
39+
[]StructDefinition{s.StructDefinition()},
40+
s.LegacyStructDefinitions()...,
41+
)
42+
43+
for _, def := range defs {
44+
switch cl, err := pp.Build(def.Namespace, def.Name); {
45+
case err == nil:
46+
return cl, nil
47+
case errors.Is(err, ErrProcessorNotDefined):
48+
default:
49+
return nil, err
50+
}
51+
}
52+
53+
return nil, ErrProcessorNotDefined
54+
}

0 commit comments

Comments
 (0)