@@ -161,7 +161,7 @@ void TrpcPlugin::InitPlugin(PluginInfo& plugin_info) {
161161 plugin_info.plugin ->GetDependencies (dep_plugin_names);
162162 if (!dep_plugin_names.empty ()) {
163163 for (const auto & name : dep_plugin_names) {
164- auto it = plugins_. find (name);
164+ auto it = FindPlugin (name);
165165 if (it == plugins_.end ()) {
166166 TRPC_FMT_ERROR (" plugin `{}` dependence plugin `{}` not found." , plugin_info.plugin ->Name (), name);
167167 TRPC_ASSERT (false );
@@ -200,7 +200,7 @@ void TrpcPlugin::StartPlugin(PluginInfo& plugin_info) {
200200 plugin_info.plugin ->GetDependencies (dep_plugin_names);
201201 if (!dep_plugin_names.empty ()) {
202202 for (const auto & name : dep_plugin_names) {
203- auto it = plugins_. find (name);
203+ auto it = FindPlugin (name);
204204 TRPC_ASSERT (it != plugins_.end ());
205205
206206 StartPlugin (it->second );
@@ -261,7 +261,7 @@ void TrpcPlugin::StopPlugin(PluginInfo& plugin_info) {
261261 std::vector<std::string>& reverse_dep_plugin_names = plugins_reverse_deps_[plugin_info.plugin ->Name ()];
262262 if (!reverse_dep_plugin_names.empty ()) {
263263 for (const auto & name : reverse_dep_plugin_names) {
264- auto it = plugins_. find (name);
264+ auto it = FindPlugin (name);
265265 TRPC_ASSERT (it != plugins_.end ());
266266
267267 StopPlugin (it->second );
@@ -293,7 +293,7 @@ void TrpcPlugin::DestroyPlugin(PluginInfo& plugin_info) {
293293 std::vector<std::string>& reverse_dep_plugin_names = plugins_reverse_deps_[plugin_info.plugin ->Name ()];
294294 if (!reverse_dep_plugin_names.empty ()) {
295295 for (const auto & name : reverse_dep_plugin_names) {
296- auto it = plugins_. find (name);
296+ auto it = FindPlugin (name);
297297 TRPC_ASSERT (it != plugins_.end ());
298298
299299 DestroyPlugin (it->second );
@@ -305,6 +305,56 @@ void TrpcPlugin::DestroyPlugin(PluginInfo& plugin_info) {
305305 plugin_info.is_destroyed = true ;
306306}
307307
308+ std::unordered_map<std::string, TrpcPlugin::PluginInfo>::iterator TrpcPlugin::FindPlugin (const std::string& name) {
309+ auto it = plugins_.find (name);
310+ if (it != plugins_.end ()) {
311+ return it;
312+ }
313+
314+ std::unordered_map<std::string, TrpcPlugin::PluginInfo>::iterator match_it = plugins_.end ();
315+ bool already_match = false ;
316+ auto new_name = name + " #" ;
317+ for (it = plugins_.begin (); it != plugins_.end (); ++it) {
318+ auto & plugin_name = it->first ;
319+ if (!plugin_name.compare (0 , new_name.size (), new_name)) {
320+ if (already_match) {
321+ TRPC_FMT_ERROR (" Find multiple match {} plugins, you need specify the dependencies with the plugin_type" , name);
322+ TRPC_ASSERT (false && " Find multiple match plugins" );
323+ } else {
324+ already_match = true ;
325+ match_it = it;
326+ }
327+ }
328+ }
329+
330+ return match_it;
331+ }
332+
333+ bool TrpcPlugin::IsDepPluginNameValid (const std::vector<std::string>& dep_plugin_names) {
334+ bool ret = true ;
335+ for (auto & plugin_name : dep_plugin_names) {
336+ auto pos = plugin_name.find_first_of (" #" );
337+ if (pos == std::string::npos) {
338+ continue ;
339+ }
340+
341+ // If it contains '#', then the string at the end should be PluginType.
342+ auto str = plugin_name.substr (pos + 1 );
343+ try {
344+ auto plugin_type = std::stoi (str);
345+ if (plugin_type > static_cast <int >(PluginType::kUnspecified )) {
346+ ret = false ;
347+ TRPC_FMT_ERROR (" dependent plugin name {} invalid" , plugin_name);
348+ }
349+ } catch (const std::exception&) {
350+ ret = false ;
351+ TRPC_FMT_ERROR (" dependent plugin name {} invalid" , plugin_name);
352+ }
353+ }
354+
355+ return ret;
356+ }
357+
308358bool TrpcPlugin::RegisterServerCodec (const ServerCodecPtr& codec) {
309359 std::scoped_lock<std::mutex> lock (mutex_);
310360
0 commit comments