Skip to content

Commit 9d4af83

Browse files
authored
Merge pull request #390 from Flow-Launcher/PluginAncestor
Make IPlugin inherit from IAsyncPlugin
2 parents b359d70 + 6bbedba commit 9d4af83

File tree

5 files changed

+29
-40
lines changed

5 files changed

+29
-40
lines changed

Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ protected override Assembly Load(AssemblyName assemblyName)
4949
return LoadFromAssemblyPath(assemblyPath);
5050
}
5151

52-
internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, params Type[] types)
52+
internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type)
5353
{
5454
var allTypes = assembly.ExportedTypes;
55-
return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Intersect(types).Any());
55+
return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Any(t => t == type));
5656
}
5757

5858
internal bool ExistsInReferencedPackage(AssemblyName assemblyName)

Flow.Launcher.Core/Plugin/PluginManager.cs

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,9 @@ public static async Task InitializePlugins(IPublicAPI api)
9797
{
9898
try
9999
{
100-
var milliseconds = pair.Plugin switch
101-
{
102-
IAsyncPlugin plugin
103-
=> await Stopwatch.DebugAsync($"|PluginManager.InitializePlugins|Init method time cost for <{pair.Metadata.Name}>",
104-
() => plugin.InitAsync(new PluginInitContext(pair.Metadata, API))),
105-
IPlugin plugin
106-
=> Stopwatch.Debug($"|PluginManager.InitializePlugins|Init method time cost for <{pair.Metadata.Name}>",
107-
() => plugin.Init(new PluginInitContext(pair.Metadata, API))),
108-
_ => throw new ArgumentException(),
109-
};
100+
var milliseconds = await Stopwatch.DebugAsync($"|PluginManager.InitializePlugins|Init method time cost for <{pair.Metadata.Name}>",
101+
() => pair.Plugin.InitAsync(new PluginInitContext(pair.Metadata, API)));
102+
110103
pair.Metadata.InitTime += milliseconds;
111104
Log.Info(
112105
$"|PluginManager.InitializePlugins|Total init cost for <{pair.Metadata.Name}> is <{pair.Metadata.InitTime}ms>");
@@ -169,19 +162,9 @@ public static async Task<List<Result>> QueryForPlugin(PluginPair pair, Query que
169162

170163
long milliseconds = -1L;
171164

172-
switch (pair.Plugin)
173-
{
174-
case IAsyncPlugin plugin:
175-
milliseconds = await Stopwatch.DebugAsync($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}",
176-
async () => results = await plugin.QueryAsync(query, token).ConfigureAwait(false));
177-
break;
178-
case IPlugin plugin:
179-
await Task.Run(() => milliseconds = Stopwatch.Debug($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}",
180-
() => results = plugin.Query(query)), token).ConfigureAwait(false);
181-
break;
182-
default:
183-
throw new ArgumentOutOfRangeException();
184-
}
165+
milliseconds = await Stopwatch.DebugAsync($"|PluginManager.QueryForPlugin|Cost for {metadata.Name}",
166+
async () => results = await pair.Plugin.QueryAsync(query, token).ConfigureAwait(false));
167+
185168
token.ThrowIfCancellationRequested();
186169
if (results == null)
187170
return results;
@@ -199,7 +182,7 @@ public static async Task<List<Result>> QueryForPlugin(PluginPair pair, Query que
199182
}
200183
catch (Exception e)
201184
{
202-
Log.Exception($"|PluginManager.QueryForPlugin|Exception for plugin <{pair.Metadata.Name}> when query <{query}>", e);
185+
Log.Exception($"|PluginManager.QueryForPlugin|Exception for plugin <{pair.Metadata.Name}> when query <{query}>", e);
203186
}
204187

205188
return results;

Flow.Launcher.Core/Plugin/PluginsLoader.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,23 @@ public static IEnumerable<PluginPair> DotNetPlugins(List<PluginMetadata> source)
4444
#if DEBUG
4545
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
4646
var assembly = assemblyLoader.LoadAssemblyAndDependencies();
47-
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin),
47+
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly,
4848
typeof(IAsyncPlugin));
4949

50-
var plugin = Activator.CreateInstance(type);
50+
var plugin = Activator.CreateInstance(type) as IAsyncPlugin;
5151
#else
5252
Assembly assembly = null;
53-
object plugin = null;
53+
IAsyncPlugin plugin = null;
5454

5555
try
5656
{
5757
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
5858
assembly = assemblyLoader.LoadAssemblyAndDependencies();
5959

60-
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin),
60+
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly,
6161
typeof(IAsyncPlugin));
6262

63-
plugin = Activator.CreateInstance(type);
63+
plugin = Activator.CreateInstance(type) as IAsyncPlugin;
6464
}
6565
catch (Exception e) when (assembly == null)
6666
{
@@ -78,13 +78,13 @@ public static IEnumerable<PluginPair> DotNetPlugins(List<PluginMetadata> source)
7878
{
7979
Log.Exception($"|PluginsLoader.DotNetPlugins|The following plugin has errored and can not be loaded: <{metadata.Name}>", e);
8080
}
81-
81+
#endif
8282
if (plugin == null)
8383
{
8484
erroredPlugins.Add(metadata.Name);
8585
return;
8686
}
87-
#endif
87+
8888
plugins.Add(new PluginPair
8989
{
9090
Plugin = plugin,
@@ -139,7 +139,7 @@ public static IEnumerable<PluginPair> PythonPlugins(List<PluginMetadata> source,
139139
}
140140
else
141141
{
142-
Log.Error("PluginsLoader","Failed to set Python path despite the environment variable PATH is found", "PythonPlugins");
142+
Log.Error("PluginsLoader", "Failed to set Python path despite the environment variable PATH is found", "PythonPlugins");
143143
}
144144
}
145145
}
@@ -152,7 +152,7 @@ public static IEnumerable<PluginPair> PythonPlugins(List<PluginMetadata> source,
152152
}
153153
else
154154
{
155-
Log.Error("PluginsLoader",$"Tried to automatically set from Settings.PythonDirectory " +
155+
Log.Error("PluginsLoader", $"Tried to automatically set from Settings.PythonDirectory " +
156156
$"but can't find python executable in {path}", "PythonPlugins");
157157
}
158158
}
@@ -205,7 +205,7 @@ public static IEnumerable<PluginPair> PythonPlugins(List<PluginMetadata> source,
205205
}
206206
else
207207
{
208-
Log.Error("PluginsLoader",
208+
Log.Error("PluginsLoader",
209209
$"Failed to set Python path after Droplex install, {pythonPath} does not exist",
210210
"PythonPlugins");
211211
}
@@ -215,8 +215,8 @@ public static IEnumerable<PluginPair> PythonPlugins(List<PluginMetadata> source,
215215
if (string.IsNullOrEmpty(settings.PythonDirectory))
216216
{
217217
MessageBox.Show("Unable to set Python executable path, please try from Flow's settings (scroll down to the bottom).");
218-
Log.Error("PluginsLoader",
219-
$"Not able to successfully set Python path, the PythonDirectory variable is still an empty string.",
218+
Log.Error("PluginsLoader",
219+
$"Not able to successfully set Python path, the PythonDirectory variable is still an empty string.",
220220
"PythonPlugins");
221221

222222
return new List<PluginPair>();

Flow.Launcher.Plugin/IPlugin.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Collections.Generic;
2+
using System.Threading;
3+
using System.Threading.Tasks;
24

35
namespace Flow.Launcher.Plugin
46
{
@@ -9,7 +11,7 @@ namespace Flow.Launcher.Plugin
911
/// or performaing CPU intense jobs (performing better with cancellation), please try the IAsyncPlugin interface
1012
/// </para>
1113
/// </summary>
12-
public interface IPlugin
14+
public interface IPlugin : IAsyncPlugin
1315
{
1416
/// <summary>
1517
/// Querying when user's search changes
@@ -27,5 +29,9 @@ public interface IPlugin
2729
/// </summary>
2830
/// <param name="context"></param>
2931
void Init(PluginInitContext context);
32+
33+
Task IAsyncPlugin.InitAsync(PluginInitContext context) => Task.Run(() => Init(context));
34+
35+
Task<List<Result>> IAsyncPlugin.QueryAsync(Query query, CancellationToken token) => Task.Run(() => Query(query));
3036
}
3137
}

Flow.Launcher.Plugin/PluginPair.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
public class PluginPair
44
{
5-
public object Plugin { get; internal set; }
5+
public IAsyncPlugin Plugin { get; internal set; }
66
public PluginMetadata Metadata { get; internal set; }
77

88

0 commit comments

Comments
 (0)