Refactor JsonRPC structure

This commit is contained in:
Kevin Zhang 2021-08-13 13:55:07 +08:00
parent f1ed346d94
commit 7ab86ca1f2
4 changed files with 34 additions and 64 deletions

View file

@ -24,36 +24,16 @@ namespace Flow.Launcher.Core.Plugin
}; };
} }
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}\""; _startInfo.Arguments = $"\"{request}\"";
return ExecuteAsync(_startInfo, token); return ExecuteAsync(_startInfo, token);
} }
protected override string ExecuteCallback(JsonRPCRequestModel rpcRequest) protected override string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default)
{ {
_startInfo.Arguments = $"\"{rpcRequest}\""; _startInfo.Arguments = $"\"{rpcRequest}\"";
return Execute(_startInfo); 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);
}
} }
} }

View file

@ -30,16 +30,22 @@ namespace Flow.Launcher.Core.Plugin
/// The language this JsonRPCPlugin support /// The language this JsonRPCPlugin support
/// </summary> /// </summary>
public abstract string SupportedLanguage { get; set; } public abstract string SupportedLanguage { get; set; }
protected abstract Task<Stream> RequestAsync(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
protected abstract Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token); protected abstract string Request(JsonRPCRequestModel rpcRequest, CancellationToken token = default);
protected abstract string ExecuteCallback(JsonRPCRequestModel rpcRequest);
protected abstract string ExecuteContextMenu(Result selectedResult);
private static readonly RecyclableMemoryStreamManager BufferManager = new(); private static readonly RecyclableMemoryStreamManager BufferManager = new();
public List<Result> LoadContextMenus(Result selectedResult) 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); return DeserializedResult(output);
} }
@ -100,7 +106,7 @@ namespace Flow.Launcher.Core.Plugin
} }
else else
{ {
var actionResponse = ExecuteCallback(result.JsonRPCAction); var actionResponse = Request(result.JsonRPCAction);
if (string.IsNullOrEmpty(actionResponse)) if (string.IsNullOrEmpty(actionResponse))
{ {
@ -283,7 +289,15 @@ namespace Flow.Launcher.Core.Plugin
public async Task<List<Result>> QueryAsync(Query query, CancellationToken token) 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); return await DeserializedResultAsync(output);
} }

View file

@ -32,13 +32,8 @@ namespace Flow.Launcher.Core.Plugin
_startInfo.ArgumentList.Add("-B"); _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(); _startInfo.ArgumentList[2] = request.ToString();
// todo happlebao why context can't be used in constructor // todo happlebao why context can't be used in constructor
@ -47,27 +42,13 @@ namespace Flow.Launcher.Core.Plugin
return ExecuteAsync(_startInfo, token); 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.ArgumentList[2] = rpcRequest.ToString();
_startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory; _startInfo.WorkingDirectory = context.CurrentPluginMetadata.PluginDirectory;
// TODO: Async Action // TODO: Async Action
return Execute(_startInfo); 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) public override Task InitAsync(PluginInitContext context)
{ {
this.context = context; this.context = context;

View file

@ -18,19 +18,14 @@ namespace Flow.Launcher.Test.Plugins
{ {
public override string SupportedLanguage { get; set; } = AllowedLanguage.Executable; 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(); throw new System.NotImplementedException();
} }
protected override string ExecuteContextMenu(Result selectedResult) protected override Task<Stream> RequestAsync(JsonRPCRequestModel request, CancellationToken token = default)
{ {
throw new System.NotImplementedException(); var byteInfo = Encoding.UTF8.GetBytes(request.Parameters[0] as string ?? string.Empty);
}
protected override Task<Stream> ExecuteQueryAsync(Query query, CancellationToken token)
{
var byteInfo = Encoding.UTF8.GetBytes(query.RawQuery);
var resultStream = new MemoryStream(byteInfo); var resultStream = new MemoryStream(byteInfo);
return Task.FromResult((Stream)resultStream); return Task.FromResult((Stream)resultStream);
@ -45,7 +40,7 @@ namespace Flow.Launcher.Test.Plugins
{ {
var results = await QueryAsync(new Query var results = await QueryAsync(new Query
{ {
RawQuery = resultText Search = resultText
}, default); }, default);
Assert.IsNotNull(results); Assert.IsNotNull(results);
@ -85,8 +80,8 @@ namespace Flow.Launcher.Test.Plugins
var pascalText = JsonSerializer.Serialize(reference); var pascalText = JsonSerializer.Serialize(reference);
var results1 = await QueryAsync(new Query { RawQuery = camelText }, default); var results1 = await QueryAsync(new Query { Search = camelText }, default);
var results2 = await QueryAsync(new Query { RawQuery = pascalText }, default); var results2 = await QueryAsync(new Query { Search = pascalText }, default);
Assert.IsNotNull(results1); Assert.IsNotNull(results1);
Assert.IsNotNull(results2); Assert.IsNotNull(results2);