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}\"";
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);
}
}
}

View file

@ -30,16 +30,22 @@ namespace Flow.Launcher.Core.Plugin
/// 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);
}
@ -100,7 +106,7 @@ namespace Flow.Launcher.Core.Plugin
}
else
{
var actionResponse = ExecuteCallback(result.JsonRPCAction);
var actionResponse = Request(result.JsonRPCAction);
if (string.IsNullOrEmpty(actionResponse))
{
@ -255,8 +261,8 @@ namespace Flow.Launcher.Core.Plugin
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}");
}
@ -283,7 +289,15 @@ namespace Flow.Launcher.Core.Plugin
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);
}
@ -293,4 +307,4 @@ namespace Flow.Launcher.Core.Plugin
return Task.CompletedTask;
}
}
}
}

View file

@ -32,13 +32,8 @@ namespace Flow.Launcher.Core.Plugin
_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
@ -47,27 +42,13 @@ namespace Flow.Launcher.Core.Plugin
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;

View file

@ -18,19 +18,14 @@ namespace Flow.Launcher.Test.Plugins
{
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);
@ -45,7 +40,7 @@ namespace Flow.Launcher.Test.Plugins
{
var results = await QueryAsync(new Query
{
RawQuery = resultText
Search = resultText
}, default);
Assert.IsNotNull(results);
@ -85,8 +80,8 @@ namespace Flow.Launcher.Test.Plugins
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);