in thrift/compiler/generate/t_go_generator.cc [2684:2826]
void t_go_generator::generate_service_server(const t_service* tservice) {
// Generate the dispatch methods
vector<const t_function*> functions = get_supported_functions(tservice);
string extends = "";
string extends_processor = "";
string extends_processor_new = "";
string serviceName(publicize(tservice->get_name()));
if (tservice->get_extends() != nullptr) {
extends = type_name(tservice->get_extends());
size_t index = extends.rfind('.');
if (index != string::npos) {
extends_processor = extends.substr(0, index + 1) +
publicize(extends.substr(index + 1)) + "Processor";
extends_processor_new = extends.substr(0, index + 1) + "New" +
publicize(extends.substr(index + 1)) + "Processor";
} else {
extends_processor = publicize(extends) + "Processor";
extends_processor_new = "New" + extends_processor;
}
}
string pServiceName(privatize(serviceName));
// Generate the header portion
string self(tmp("self"));
// TODO should handle extends?
if (extends_processor.empty()) {
f_service_ << indent() << "type " << serviceName << "Processor struct {"
<< endl;
f_service_ << indent() << " processorMap map[string]"
<< gen_processor_func_ << endl;
f_service_ << indent() << " functionServiceMap map[string]string" << endl;
f_service_ << indent() << " handler " << serviceName << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func (p *" << serviceName
<< "Processor) AddToProcessorMap(key string, processor "
<< gen_processor_func_ << ") {" << endl;
f_service_ << indent() << " p.processorMap[key] = processor" << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func (p *" << serviceName
<< "Processor) AddToFunctionServiceMap(key, service string) {"
<< endl;
f_service_ << indent() << " p.functionServiceMap[key] = service" << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func (p *" << serviceName << "Processor) ";
if (gen_use_context_) {
f_service_ << "GetProcessorFunctionContext(key string) ";
} else {
f_service_ << "GetProcessorFunction(key string) ";
}
f_service_ << "(processor " << gen_processor_func_ << ", err error) {"
<< endl;
indent_up();
f_service_ << indent() << "if processor, ok := p.processorMap[key]; ok {"
<< endl;
f_service_ << indent() << " return processor, nil" << endl;
f_service_ << indent() << "}" << endl;
f_service_ << indent()
<< "return nil, nil // generic error message will be sent"
<< endl;
indent_down();
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func (p *" << serviceName
<< "Processor) ProcessorMap() map[string]" << gen_processor_func_
<< " {" << endl;
f_service_ << indent() << " return p.processorMap" << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func (p *" << serviceName
<< "Processor) FunctionServiceMap() map[string]string {" << endl;
f_service_ << indent() << " return p.functionServiceMap" << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func New" << serviceName << "Processor(handler "
<< serviceName << ") *" << serviceName << "Processor {" << endl;
f_service_ << indent() << " " << self << " := &" << serviceName
<< "Processor{handler:handler, "
"processorMap:make(map[string]"
<< gen_processor_func_
<< "), functionServiceMap:make(map[string]string)}" << endl;
indent_up();
for (const auto* func : functions) {
string escapedFuncName(escape_string(func->get_name()));
f_service_ << indent() << self << ".processorMap[\"" << escapedFuncName
<< "\"] = &" << pServiceName << "Processor"
<< publicize(func->get_name()) << "{handler:handler}" << endl;
}
for (const auto* func : functions) {
string escapedFuncName(escape_string(func->get_name()));
f_service_ << indent() << self << ".functionServiceMap[\""
<< escapedFuncName << "\"] = \"" << serviceName << "\""
<< endl;
}
string x(tmp("x"));
f_service_ << indent() << "return " << self << endl;
indent_down();
f_service_ << indent() << "}" << endl << endl;
} else {
f_service_ << indent() << "type " << serviceName << "Processor struct {"
<< endl;
f_service_ << indent() << " *" << extends_processor << endl;
f_service_ << indent() << "}" << endl << endl;
f_service_ << indent() << "func New" << serviceName << "Processor(handler "
<< serviceName << ") *" << serviceName << "Processor {" << endl;
f_service_ << indent() << " " << self << " := &" << serviceName
<< "Processor{" << extends_processor_new << "(handler)}" << endl;
for (const auto* func : functions) {
string escapedFuncName(escape_string(func->get_name()));
f_service_ << indent() << " " << self << ".AddToProcessorMap(\""
<< escapedFuncName << "\", &" << pServiceName << "Processor"
<< publicize((func)->get_name()) << "{handler:handler})"
<< endl;
}
for (const auto* func : functions) {
string escapedFuncName(escape_string(func->get_name()));
f_service_ << indent() << " " << self << ".AddToFunctionServiceMap(\""
<< escapedFuncName << "\", \"" << serviceName << "\")" << endl;
}
f_service_ << indent() << " return " << self << endl;
f_service_ << indent() << "}" << endl << endl;
}
// Generate the process subfunctions
for (const auto* func : functions) {
generate_process_function_type(tservice, func);
generate_struct_error_result_fn(tservice, func);
generate_read_function(tservice, func);
generate_write_function(tservice, func);
generate_run_function(tservice, func);
}
f_service_ << endl;
}