Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 2 additions & 22 deletions Flow.Launcher.Core/Plugin/ExecutablePlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,16 @@ public ExecutablePlugin(string filename)
};
}

protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
{
Method = "query",
Parameters = new object[] {query.Search},
};

_startInfo.Arguments = $"\"{request}\"";

return ExecuteAsync(_startInfo, token);
}

protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
_startInfo.Arguments = $"\"{rpcRequest}\"";
return Execute(_startInfo);
}

protected override string ExecuteContextMenu(Result selectedResult)
{
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
{
Method = "contextmenu",
Parameters = new object[] {selectedResult.ContextData},
};

_startInfo.Arguments = $"\"{request}\"";

return Execute(_startInfo);
}
}
}
43 changes: 24 additions & 19 deletions Flow.Launcher.Core/Plugin/JsonRPCPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,22 @@ internal abstract class JsonRPCPlugin : IAsyncPlugin, IContextMenu
/// The language this JsonRPCPlugin support
/// </summary>
public abstract string SupportedLanguage { get; set; }

protected abstract Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token);
protected abstract string ExecuteCallback(JsonRPCRequestModel rpcRequest);
protected abstract string ExecuteContextMenu(Result selectedResult);
protected abstract Task<Stream> RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
protected abstract string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default);

private static readonly RecyclableMemoryStreamManager BufferManager = new();

public List<Result> LoadContextMenus(Result selectedResult)
{
var output = ExecuteContextMenu(selectedResult);
var request = new JsonRPCRequestModel
{
Method = "context_menu",
Parameters = new[]
{
selectedResult.ContextData
}
};
var output = Request(request);
return DeserializedResult(output);
}

Expand Down Expand Up @@ -100,7 +106,7 @@ private List<Result> ParseResults(JsonRPCQueryResponseModel queryResponseModel)
}
else
{
var actionResponse = ExecuteCallback(result.JsonRPCAction);
var actionResponse = Request(result.JsonRPCAction);

if (string.IsNullOrEmpty(actionResponse))
{
Expand Down Expand Up @@ -192,15 +198,6 @@ protected string Execute(ProcessStartInfo startInfo)
return string.Empty;
}

if (result.StartsWith("DEBUG:"))
{
MessageBox.Show(new Form
{
TopMost = true
}, result.Substring(6));
return string.Empty;
}

return result;
}
catch (Exception e)
Expand Down Expand Up @@ -255,8 +252,8 @@ protected async Task<Stream> ExecuteAsync(ProcessStartInfo startInfo, Cancellati

if (buffer.Length == 0)
{
var errorMessage = process.StandardError.EndOfStream ?
"Empty JSONRPC Response" :
var errorMessage = process.StandardError.EndOfStream ?
"Empty JSONRPC Response" :
await process.StandardError.ReadToEndAsync();
throw new InvalidDataException($"{context.CurrentPluginMetadata.Name}|{errorMessage}");
}
Expand All @@ -283,7 +280,15 @@ protected async Task<Stream> ExecuteAsync(ProcessStartInfo startInfo, Cancellati

public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
{
var output = await ExecuteQueryAsync(query, token);
var request = new JsonRPCRequestModel
{
Method = "query",
Parameters = new[]
{
query.Search
}
};
var output = await RequestAsync(request, token);
return await DeserializedResultAsync(output);
}

Expand All @@ -293,4 +298,4 @@ public virtual Task InitAsync(PluginInitContext context)
return Task.CompletedTask;
}
}
}
}
29 changes: 5 additions & 24 deletions Flow.Launcher.Core/Plugin/PythonPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,47 +32,28 @@ public PythonPlugin(string filename)
_startInfo.ArgumentList.Add("-B");
}

protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
{
Method = "query", Parameters = new object[] {query.Search},
};

_startInfo.ArgumentList[2] = request.ToString();

// todo happlebao why context can't be used in constructor
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;

return ExecuteAsync(_startInfo, token);
}

protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
_startInfo.ArgumentList[2] = rpcRequest.ToString();
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action
return Execute(_startInfo);
}

protected override string ExecuteContextMenu(Result selectedResult)
{
JsonRPCServerRequestModel request = new JsonRPCServerRequestModel
{
Method = "context_menu", Parameters = new object[] {selectedResult.ContextData},
};
_startInfo.ArgumentList[2] = request.ToString();
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;

// TODO: Async Action
return Execute(_startInfo);
}

public override Task InitAsync(PluginInitContext context)
{
this.context = context;
_startInfo.ArgumentList.Add(context.CurrentPluginMetadata.ExecuteFilePath);
_startInfo.ArgumentList.Add("");

_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;

return Task.CompletedTask;
}
}
Expand Down
17 changes: 6 additions & 11 deletions Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,14 @@ internal class JsonRPCPluginTest : JsonRPCPlugin
{
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable;

protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest)
protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{
throw new System.NotImplementedException();
}

protected override string ExecuteContextMenu(Result selectedResult)
protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{
throw new System.NotImplementedException();
}

protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
{
var byteInfo = Encoding.UTF8.GetBytes(query.RawQuery);
var byteInfo = Encoding.UTF8.GetBytes(request.Parameters[0] as string ?? string.Empty);

var resultStream = new MemoryStream(byteInfo);
return Task.FromResult((Stream)resultStream);
Expand All @@ -45,7 +40,7 @@ public async Task GivenVariousJsonText_WhenVariousNamingCase_ThenExpectNotNullRe
{
var results = await QueryAsync(new Query
{
RawQuery = resultText
Search = resultText
}, default);

Assert.IsNotNull(results);
Expand Down Expand Up @@ -85,8 +80,8 @@ public async Task GivenModel_WhenSerializeWithDifferentNamingPolicy_ThenExpectSa

var pascalText = JsonSerializer.Serialize(reference);

var results1 = await QueryAsync(new Query { RawQuery = camelText }, default);
var results2 = await QueryAsync(new Query { RawQuery = pascalText }, default);
var results1 = await QueryAsync(new Query { Search = camelText }, default);
var results2 = await QueryAsync(new Query { Search = pascalText }, default);

Assert.IsNotNull(results1);
Assert.IsNotNull(results2);
Expand Down