Skip to content

Commit 98fd43b

Browse files
committed
Add TemplateService for Plaster integration
This change introduces a new TemplateService which uses the new Plaster module to provide the following features: 1. Listing available Plaster templates on the user's machine, both built-in and contained within other PowerShell modules 2. Creating new projects from Plaster templates This functionality is exposed up through the language service by the powerShell/getProjectTemplates and powerShell/newProjectFromTemplate request types.
1 parent ddb2bba commit 98fd43b

File tree

8 files changed

+345
-0
lines changed

8 files changed

+345
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
4+
//
5+
6+
using Microsoft.PowerShell.EditorServices.Protocol.MessageProtocol;
7+
using Microsoft.PowerShell.EditorServices.Templates;
8+
9+
namespace Microsoft.PowerShell.EditorServices.Protocol.LanguageServer
10+
{
11+
public class NewProjectFromTemplateRequest
12+
{
13+
public static readonly
14+
RequestType<NewProjectFromTemplateRequest, NewProjectFromTemplateResponse> Type =
15+
RequestType<NewProjectFromTemplateRequest, NewProjectFromTemplateResponse>.Create("powerShell/newProjectFromTemplate");
16+
17+
public string DestinationPath { get; set; }
18+
19+
public string TemplatePath { get; set; }
20+
}
21+
22+
public class NewProjectFromTemplateResponse
23+
{
24+
public bool CreationSuccessful { get; set; }
25+
}
26+
27+
public class GetProjectTemplatesRequest
28+
{
29+
public static readonly
30+
RequestType<GetProjectTemplatesRequest, GetProjectTemplatesResponse> Type =
31+
RequestType<GetProjectTemplatesRequest, GetProjectTemplatesResponse>.Create("powerShell/getProjectTemplates");
32+
33+
public bool IncludeInstalledModules { get; set; }
34+
}
35+
36+
public class GetProjectTemplatesResponse
37+
{
38+
public bool NeedsModuleInstall { get; set; }
39+
40+
public TemplateDetails[] Templates { get; set; }
41+
}
42+
}

src/PowerShellEditorServices.Protocol/PowerShellEditorServices.Protocol.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<Compile Include="LanguageServer\InstallModuleRequest.cs" />
6363
<Compile Include="LanguageServer\PowerShellVersionRequest.cs" />
6464
<Compile Include="LanguageServer\SetPSSARulesRequest.cs" />
65+
<Compile Include="LanguageServer\ProjectTemplate.cs" />
6566
<Compile Include="MessageProtocol\Channel\NamedPipeClientChannel.cs" />
6667
<Compile Include="MessageProtocol\Channel\NamedPipeServerChannel.cs" />
6768
<Compile Include="MessageProtocol\Channel\TcpSocketClientChannel.cs" />

src/PowerShellEditorServices.Protocol/Server/LanguageServer.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Microsoft.PowerShell.EditorServices.Protocol.MessageProtocol;
99
using Microsoft.PowerShell.EditorServices.Protocol.MessageProtocol.Channel;
1010
using Microsoft.PowerShell.EditorServices.Session;
11+
using Microsoft.PowerShell.EditorServices.Templates;
1112
using Microsoft.PowerShell.EditorServices.Utility;
1213
using Newtonsoft.Json.Linq;
1314
using System;
@@ -107,6 +108,9 @@ protected override void Initialize()
107108

108109
this.SetRequestHandler(PowerShellVersionRequest.Type, this.HandlePowerShellVersionRequest);
109110

111+
this.SetRequestHandler(NewProjectFromTemplateRequest.Type, this.HandleNewProjectFromTemplateRequest);
112+
this.SetRequestHandler(GetProjectTemplatesRequest.Type, this.HandleGetProjectTemplatesRequest);
113+
110114
this.SetRequestHandler(DebugAdapterMessages.EvaluateRequest.Type, this.HandleEvaluateRequest);
111115

112116
this.SetRequestHandler(GetPSSARulesRequest.Type, this.HandleGetPSSARulesRequest);
@@ -280,6 +284,55 @@ private Task HandleInvokeExtensionCommandRequest(
280284
return Task.FromResult(true);
281285
}
282286

287+
private Task HandleNewProjectFromTemplateRequest(
288+
NewProjectFromTemplateRequest newProjectArgs,
289+
RequestContext<NewProjectFromTemplateResponse> requestContext)
290+
{
291+
// Don't await the Task here so that we don't block the session
292+
this.editorSession.TemplateService
293+
.CreateFromTemplate(newProjectArgs.TemplatePath, newProjectArgs.DestinationPath)
294+
.ContinueWith(
295+
async task =>
296+
{
297+
await requestContext.SendResult(
298+
new NewProjectFromTemplateResponse
299+
{
300+
CreationSuccessful = task.Result
301+
});
302+
});
303+
304+
return Task.FromResult(true);
305+
}
306+
307+
private async Task HandleGetProjectTemplatesRequest(
308+
GetProjectTemplatesRequest requestArgs,
309+
RequestContext<GetProjectTemplatesResponse> requestContext)
310+
{
311+
bool plasterInstalled = await this.editorSession.TemplateService.ImportPlasterIfInstalled();
312+
313+
if (plasterInstalled)
314+
{
315+
var availableTemplates =
316+
await this.editorSession.TemplateService.GetAvailableTemplates(
317+
requestArgs.IncludeInstalledModules);
318+
319+
await requestContext.SendResult(
320+
new GetProjectTemplatesResponse
321+
{
322+
Templates = availableTemplates
323+
});
324+
}
325+
else
326+
{
327+
await requestContext.SendResult(
328+
new GetProjectTemplatesResponse
329+
{
330+
NeedsModuleInstall = true,
331+
Templates = new TemplateDetails[0]
332+
});
333+
}
334+
}
335+
283336
private async Task HandleExpandAliasRequest(
284337
string content,
285338
RequestContext<string> requestContext)

src/PowerShellEditorServices/Nano.PowerShellEditorServices.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
<Compile Include="Extensions\ExtensionService.cs" />
7272
<Compile Include="Extensions\FileContext.cs" />
7373
<Compile Include="Extensions\IEditorOperations.cs" />
74+
<Compile Include="Templates\TemplateService.cs" />
75+
<Compile Include="Templates\TemplateDetails.cs" />
7476
<Compile Include="Language\AstOperations.cs" />
7577
<Compile Include="Language\CommandHelpers.cs" />
7678
<Compile Include="Language\CompletionResults.cs" />
@@ -143,6 +145,7 @@
143145
<Compile Include="..\PowerShellEditorServices.Protocol\DebugAdapter\ContinueRequest.cs" />
144146
<Compile Include="..\PowerShellEditorServices.Protocol\DebugAdapter\SetFunctionBreakpointsRequest.cs" />
145147
<Compile Include="..\PowerShellEditorServices.Protocol\LanguageServer\EditorCommands.cs" />
148+
<Compile Include="..\PowerShellEditorServices.Protocol\LanguageServer\ProjectTemplate.cs" />
146149
<Compile Include="..\PowerShellEditorServices.Protocol\LanguageServer\FindModuleRequest.cs" />
147150
<Compile Include="..\PowerShellEditorServices.Protocol\LanguageServer\InstallModuleRequest.cs" />
148151
<Compile Include="..\PowerShellEditorServices.Protocol\LanguageServer\PowerShellVersionRequest.cs" />

src/PowerShellEditorServices/PowerShellEditorServices.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@
126126
<Compile Include="Session\SessionPSHostRawUserInterface.cs" />
127127
<Compile Include="Session\SessionPSHostUserInterface.cs" />
128128
<Compile Include="Session\SessionStateChangedEventArgs.cs" />
129+
<Compile Include="Templates\TemplateDetails.cs" />
130+
<Compile Include="Templates\TemplateService.cs" />
129131
<Compile Include="Utility\AsyncContextThread.cs" />
130132
<Compile Include="Utility\AsyncDebouncer.cs" />
131133
<Compile Include="Utility\AsyncLock.cs" />

src/PowerShellEditorServices/Session/EditorSession.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.PowerShell.EditorServices.Console;
77
using Microsoft.PowerShell.EditorServices.Extensions;
88
using Microsoft.PowerShell.EditorServices.Session;
9+
using Microsoft.PowerShell.EditorServices.Templates;
910
using Microsoft.PowerShell.EditorServices.Utility;
1011
using System.IO;
1112

@@ -54,6 +55,11 @@ public class EditorSession
5455
/// </summary>
5556
public ExtensionService ExtensionService { get; private set; }
5657

58+
/// <summary>
59+
/// Gets the TemplateService instance for this session.
60+
/// </summary>
61+
public TemplateService TemplateService { get; private set; }
62+
5763
#endregion
5864

5965
#region Public Methods
@@ -76,6 +82,7 @@ public void StartSession(HostDetails hostDetails, ProfilePaths profilePaths)
7682
this.DebugService = new DebugService(this.PowerShellContext);
7783
this.ConsoleService = new ConsoleService(this.PowerShellContext);
7884
this.ExtensionService = new ExtensionService(this.PowerShellContext);
85+
this.TemplateService = new TemplateService(this.PowerShellContext);
7986

8087
this.InstantiateAnalysisService();
8188

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//
2+
// Copyright (c) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
4+
//
5+
6+
namespace Microsoft.PowerShell.EditorServices.Templates
7+
{
8+
/// <summary>
9+
/// Provides details about a file or project template.
10+
/// </summary>
11+
public class TemplateDetails
12+
{
13+
/// <summary>
14+
/// Gets or sets the title of the template.
15+
/// </summary>
16+
public string Title { get; set; }
17+
18+
/// <summary>
19+
/// Gets or sets the author of the template.
20+
/// </summary>
21+
public string Author { get; set; }
22+
23+
/// <summary>
24+
/// Gets or sets the version of the template.
25+
/// </summary>
26+
public string Version { get; set; }
27+
28+
/// <summary>
29+
/// Gets or sets the description of the template.
30+
/// </summary>
31+
public string Description { get; set; }
32+
33+
/// <summary>
34+
/// Gets or sets the template's comma-delimited string of tags.
35+
/// </summary>
36+
public string Tags { get; set; }
37+
38+
/// <summary>
39+
/// Gets or sets the template's folder path.
40+
/// </summary>
41+
public string TemplatePath { get; set; }
42+
}
43+
}

0 commit comments

Comments
 (0)