@@ -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 ->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" 
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" 
348+       }
349+     } catch  (const  std::exception&) {
350+       ret = false ;
351+       TRPC_FMT_ERROR (" dependent plugin name {} invalid" 
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