|
6 | 6 | using System.Threading.Tasks; |
7 | 7 | using Google.Protobuf; |
8 | 8 | using Microsoft.Extensions.DependencyInjection; |
| 9 | +using Newtonsoft.Json; |
9 | 10 | using Newtonsoft.Json.Linq; |
10 | 11 | using OmniSharp.Extensions.LanguageServer.Protocol.Models; |
11 | 12 | using OmniSharp.Extensions.LanguageServer.Protocol.Server; |
12 | 13 | using OmniSharp.Extensions.LanguageServer.Protocol.Window; |
13 | 14 | using OmniSharp.Extensions.LanguageServer.Protocol.Workspace; |
14 | 15 | using OmniSharp.Extensions.LanguageServer.Server; |
| 16 | +using static YarnLanguageServer.JsonConfigFile; |
15 | 17 |
|
16 | 18 | [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("YarnLanguageServer.Tests")] |
17 | 19 |
|
@@ -182,6 +184,15 @@ public static LanguageServerOptions ConfigureOptions(LanguageServerOptions optio |
182 | 184 | } |
183 | 185 | ); |
184 | 186 |
|
| 187 | + // Register Load External Action Source command |
| 188 | + options.OnExecuteCommand<bool>( |
| 189 | + (commandParams, cancellationToken) => LoadExternalActionSourceAsync(workspace, commandParams, cancellationToken), |
| 190 | + (_, _) => new ExecuteCommandRegistrationOptions |
| 191 | + { |
| 192 | + Commands = new[] { Commands.LoadExternalActionSource }, |
| 193 | + } |
| 194 | + ); |
| 195 | + |
185 | 196 | return options; |
186 | 197 | } |
187 | 198 |
|
@@ -829,5 +840,51 @@ private static Task<Container<ProjectInfo>> ListProjectsAsync(Workspace workspac |
829 | 840 | }); |
830 | 841 | return Task.FromResult(Container.From(info)); |
831 | 842 | } |
| 843 | + |
| 844 | + private static Task<bool> LoadExternalActionSourceAsync(Workspace workspace, ExecuteCommandParams<bool> commandParams, CancellationToken cancellationToken) |
| 845 | + { |
| 846 | + if (commandParams.Arguments == null || commandParams.Arguments.Count < 2) |
| 847 | + { |
| 848 | + workspace.ShowMessage($"{Commands.LoadExternalActionSource} expects at least two arguments: a source key and a json of actions (same format as ysls.json)", MessageType.Error); |
| 849 | + return Task.FromResult(false); |
| 850 | + } |
| 851 | + |
| 852 | + var externalActionSourceName = commandParams.Arguments[0].ToString(); |
| 853 | + var externalActionContent = commandParams.Arguments[1].ToString(); |
| 854 | + |
| 855 | + var parsedActions = JsonConvert.DeserializeObject<JsonConfigFormat>(externalActionContent); |
| 856 | + if (parsedActions == null) |
| 857 | + { |
| 858 | + workspace.ShowMessage($"Failed to parse external action source JSON for {externalActionSourceName}", MessageType.Error); |
| 859 | + return Task.FromResult(false); |
| 860 | + } |
| 861 | + |
| 862 | + var actionsToImport = new HashSet<Action>(); |
| 863 | + foreach (var definition in parsedActions.Functions) |
| 864 | + { |
| 865 | + Action action = definition.ToAction(); |
| 866 | + action.IsBuiltIn = false; |
| 867 | + action.Type = ActionType.Function; |
| 868 | + if (!actionsToImport.Add(action)) { |
| 869 | + workspace.ShowMessage($"Duplicate action found for function: {externalActionSourceName}", MessageType.Error); |
| 870 | + return Task.FromResult(false); |
| 871 | + } |
| 872 | + } |
| 873 | + |
| 874 | + foreach (var definition in parsedActions.Commands) |
| 875 | + { |
| 876 | + Action action = definition.ToAction(); |
| 877 | + action.IsBuiltIn = false; |
| 878 | + action.Type = ActionType.Command; |
| 879 | + if (!actionsToImport.Add(action)) { |
| 880 | + workspace.ShowMessage($"Duplicate action found for command: {externalActionSourceName}", MessageType.Error); |
| 881 | + return Task.FromResult(false); |
| 882 | + } |
| 883 | + } |
| 884 | + |
| 885 | + workspace.ImportExternalActionSource(externalActionSourceName, actionsToImport); |
| 886 | + workspace.ReloadWorkspace(cancellationToken); |
| 887 | + return Task.FromResult(true); |
| 888 | + } |
832 | 889 | } |
833 | 890 | } |
0 commit comments