/* We basically follow the Json-RPC 2.0 spec (http://www.jsonrpc.org/specification) to invoke methods between Flow Launcher and other plugins, * like python or other self-execute program. But, we added addtional infos (proxy and so on) into rpc request. Also, we didn't use the * "id" and "jsonrpc" in the request, since it's not so useful in our request model. * * When execute a query: * Flow Launcher -------JsonRPCServerRequestModel--------> client * Flow Launcher <------JsonRPCQueryResponseModel--------- client * * When execute a action (which mean user select an item in reulst item): * Flow Launcher -------JsonRPCServerRequestModel--------> client * Flow Launcher <------JsonRPCResponseModel-------------- client * */ using System.Collections.Generic; using System.Text.Json.Serialization; using Flow.Launcher.Plugin; using System.Text.Json; namespace Flow.Launcher.Core.Plugin { public record JsonRPCBase(int Id, JsonRPCErrorModel Error = default); public record JsonRPCErrorModel(int Code, string Message, string Data); public record JsonRPCResponseModel(int Id, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error); public record JsonRPCQueryResponseModel(int Id, [property: JsonPropertyName("result")] List Result, IReadOnlyDictionary SettingsChange = null, string DebugMessage = "", JsonRPCErrorModel Error = default) : JsonRPCResponseModel(Id, Error); public record JsonRPCRequestModel(int Id, string Method, object[] Parameters, IReadOnlyDictionary Settings = default, JsonRPCErrorModel Error = default) : JsonRPCBase(Id, Error); /// /// Json RPC Request(in query response) that client sent to Flow Launcher /// public record JsonRPCClientRequestModel( int Id, string Method, object[] Parameters, IReadOnlyDictionary Settings, bool DontHideAfterAction = false, JsonRPCErrorModel Error = default) : JsonRPCRequestModel(Id, Method, Parameters, Settings, Error); /// /// Represent the json-rpc result item that client send to Flow Launcher /// Typically, we will send back this request model to client after user select the result item /// But if the request method starts with "Flow Launcher.", we will invoke the public APIs we expose. /// public class JsonRPCResult : Result { public JsonRPCClientRequestModel JsonRPCAction { get; set; } public Dictionary SettingsChange { get; set; } } }