Skip to content

Commit 0f45400

Browse files
committed
Add IPowerShellObjectMapper
1 parent ed1ea61 commit 0f45400

12 files changed

+107
-37
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Kysect.PowerShellRunner.Abstractions.Objects;
2+
using Kysect.PowerShellRunner.Abstractions.Variables;
3+
4+
namespace Kysect.PowerShellRunner.Abstractions.Cmdlets;
5+
6+
public interface IPowerShellCmdletExecutor
7+
{
8+
IReadOnlyCollection<IPowerShellObject> Execute(IPowerShellCmdlet cmdlet);
9+
PowerShellVariable<IPowerShellObject> InitializeVariable(string variableName, IPowerShellCmdlet cmdlet);
10+
11+
IReadOnlyCollection<T> Execute<T>(IPowerShellCmdlet<T> cmdlet) where T : notnull;
12+
PowerShellVariable<T> InitializeVariable<T>(string variableName, IPowerShellCmdlet<T> cmdlet) where T : notnull;
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Kysect.PowerShellRunner.Abstractions.Objects;
2+
3+
namespace Kysect.PowerShellRunner.Abstractions.Cmdlets;
4+
5+
public interface IPowerShellObjectMapper
6+
{
7+
T Map<T>(IPowerShellObject powerShellObject) where T : notnull;
8+
}

Sources/Kysect.PowerShellRunner.Configuration/PowerShellServiceCollectionExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using Kysect.CommonLib.BaseTypes.Extensions;
22
using Kysect.CommonLib.DependencyInjection.Logging;
33
using Kysect.PowerShellRunner.Abstractions.Accessors;
4+
using Kysect.PowerShellRunner.Abstractions.Cmdlets;
45
using Kysect.PowerShellRunner.Accessors;
6+
using Kysect.PowerShellRunner.Cmdlets;
57
using Microsoft.Extensions.DependencyInjection;
68

79
namespace Kysect.PowerShellRunner.Configuration;
@@ -29,6 +31,11 @@ public static IServiceCollection AddPowerShellAccessor(this IServiceCollection s
2931
return serviceCollection.AddSingleton(GetPowerShellAccessor);
3032
}
3133

34+
public static IServiceCollection AddPowerShellCmdletExecutor(this IServiceCollection serviceCollection)
35+
{
36+
return serviceCollection.AddSingleton<IPowerShellCmdletExecutor, PowerShellCmdletExecutor>();
37+
}
38+
3239
private static IPowerShellAccessor GetPowerShellAccessor(IServiceProvider serviceProvider)
3340
{
3441
IPowerShellLogger powerShellLogger = serviceProvider.GetRequiredService<IPowerShellLogger>();

Sources/Kysect.PowerShellRunner.Tests/PowerShellAccessorCmdletExecutionContextTests.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using FluentAssertions;
2+
using Kysect.PowerShellRunner.Abstractions.Variables;
3+
using Kysect.PowerShellRunner.Cmdlets;
4+
using Kysect.PowerShellRunner.CustomCmdlets;
5+
using Kysect.PowerShellRunner.Mapping;
6+
using Kysect.PowerShellRunner.Tests.Mocks;
7+
using NUnit.Framework;
8+
9+
namespace Kysect.PowerShellRunner.Tests;
10+
11+
public class PowerShellCmdletExecutorTests
12+
{
13+
[Test]
14+
public void ExecuteAndSetTo_NonGenericImplementation_FinishWithoutError()
15+
{
16+
string expectedResult = @"C:\\Folder";
17+
18+
using var testPowerShellAccessor = new FakePowerShellAccessor();
19+
var powerShellCmdletExecutor = new PowerShellCmdletExecutor(testPowerShellAccessor, PowerShellObjectMapper.Instance);
20+
testPowerShellAccessor.SetSuccessResult(new GetLocationCmdletWrapperResult(expectedResult));
21+
22+
PowerShellVariable<GetLocationCmdletWrapperResult> result = powerShellCmdletExecutor.InitializeVariable("$result", new GetLocationCmdlet());
23+
24+
GetLocationCmdletWrapperResult resultObject = result.Values.Single();
25+
resultObject.Path.Should().NotBeNull();
26+
}
27+
}

Sources/Kysect.PowerShellRunner.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ EndProject
1515
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1D69C86F-577E-4246-B9E7-B7D2C3F6E0A3}"
1616
ProjectSection(SolutionItems) = preProject
1717
Directory.Build.props = Directory.Build.props
18+
Directory.Packages.props = Directory.Packages.props
1819
EndProjectSection
1920
EndProject
2021
Global

Sources/Kysect.PowerShellRunner/Accessors/PowerShellAccessorFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public class PowerShellAccessorFactory : IPowerShellAccessorFactory
66
{
77
public IPowerShellAccessor Create()
88
{
9+
#pragma warning disable CA2000 // Dispose objects before losing scope
910
return new PowerShellAccessor(System.Management.Automation.PowerShell.Create());
11+
#pragma warning restore CA2000 // Dispose objects before losing scope
1012
}
1113
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using Kysect.PowerShellRunner.Abstractions.Accessors;
2+
using Kysect.PowerShellRunner.Abstractions.Cmdlets;
3+
using Kysect.PowerShellRunner.Abstractions.Objects;
4+
using Kysect.PowerShellRunner.Abstractions.Queries;
5+
using Kysect.PowerShellRunner.Abstractions.Variables;
6+
using Kysect.PowerShellRunner.Executions;
7+
using Kysect.PowerShellRunner.QueryBuilding;
8+
9+
namespace Kysect.PowerShellRunner.Cmdlets;
10+
11+
public class PowerShellCmdletExecutor(IPowerShellAccessor accessor, IPowerShellObjectMapper powerShellObjectMapper)
12+
: IPowerShellCmdletExecutor
13+
{
14+
public IReadOnlyCollection<IPowerShellObject> Execute(IPowerShellCmdlet cmdlet)
15+
{
16+
PowerShellQuery powerShellQuery = cmdlet.BuildFromCmdlet();
17+
18+
return accessor.ExecuteAndGet(powerShellQuery).ToList();
19+
}
20+
21+
public PowerShellVariable<IPowerShellObject> InitializeVariable(string variableName, IPowerShellCmdlet cmdlet)
22+
{
23+
var powerShellVariable = new PowerShellVariable(variableName);
24+
PowerShellQuery powerShellQuery = cmdlet.BuildFromCmdlet();
25+
return new PowerShellVariableInitializer(accessor, powerShellVariable, powerShellObjectMapper).With(powerShellQuery);
26+
}
27+
28+
public IReadOnlyCollection<T> Execute<T>(IPowerShellCmdlet<T> cmdlet) where T : notnull
29+
{
30+
PowerShellQuery powerShellQuery = cmdlet.BuildFromCmdlet();
31+
32+
return accessor.ExecuteAndGet(powerShellQuery)
33+
.Select(powerShellObjectMapper.Map<T>)
34+
.ToList();
35+
}
36+
37+
public PowerShellVariable<T> InitializeVariable<T>(string variableName, IPowerShellCmdlet<T> cmdlet) where T : notnull
38+
{
39+
var powerShellVariable = new PowerShellVariable(variableName);
40+
PowerShellQuery powerShellQuery = cmdlet.BuildFromCmdlet();
41+
return new PowerShellVariableInitializer(accessor, powerShellVariable, powerShellObjectMapper).With<T>(powerShellQuery);
42+
}
43+
}

Sources/Kysect.PowerShellRunner/CustomCmdlets/ConvertToSecureStringCmdlet.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ public class ConvertToSecureStringCmdlet : IPowerShellCmdlet<SecureString>
99
{
1010
public string CmdletName => "ConvertTo-SecureString";
1111

12-
#pragma warning disable CA1720 // Identifier contains type name
1312
public IPowerShellCmdletParameter<string> String { get; } = null!;
14-
#pragma warning restore CA1720 // Identifier contains type name
1513
public IPowerShellCmdletParameter<SwitchParameter> AsPlainText { get; } = null!;
1614
public IPowerShellCmdletParameter<SwitchParameter> Force { get; } = null!;
1715
}

Sources/Kysect.PowerShellRunner/Executions/PowerShellAccessorCmdletExecutionContext.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public PowerShellAccessorCmdletExecutionContext(IPowerShellAccessor accessor, IP
2020
_cmdlet = cmdlet;
2121
_accessor = accessor;
2222

23-
_morphisms = new List<Func<PowerShellQuery, PowerShellQuery>>();
2423
_powerShellObjectMapper = PowerShellObjectMapper.Instance;
24+
_morphisms = new List<Func<PowerShellQuery, PowerShellQuery>>();
2525
}
2626

2727
public PowerShellAccessorCmdletExecutionContext<T> Continue(Func<PowerShellQuery, PowerShellQuery> morphism)
@@ -42,9 +42,7 @@ public IReadOnlyCollection<T> Execute()
4242
public PowerShellVariable<T> ExecuteAndSetTo(string variableName)
4343
{
4444
var powerShellVariable = new PowerShellVariable(variableName);
45-
4645
PowerShellQuery powerShellQuery = BuildQuery();
47-
4846
return new PowerShellVariableInitializer(_accessor, powerShellVariable, _powerShellObjectMapper).With<T>(powerShellQuery);
4947
}
5048

@@ -68,8 +66,8 @@ public PowerShellAccessorCmdletExecutionContext(IPowerShellAccessor accessor, IP
6866
_cmdlet = cmdlet;
6967
_accessor = accessor;
7068

71-
_morphisms = new List<Func<PowerShellQuery, PowerShellQuery>>();
7269
_powerShellObjectMapper = PowerShellObjectMapper.Instance;
70+
_morphisms = new List<Func<PowerShellQuery, PowerShellQuery>>();
7371
}
7472

7573
public PowerShellAccessorCmdletExecutionContext Continue(Func<PowerShellQuery, PowerShellQuery> morphism)

Sources/Kysect.PowerShellRunner/Executions/PowerShellVariableInitializer.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Kysect.PowerShellRunner.Abstractions.Objects;
55
using Kysect.PowerShellRunner.Abstractions.Queries;
66
using Kysect.PowerShellRunner.Abstractions.Variables;
7-
using Kysect.PowerShellRunner.Mapping;
87
using Kysect.PowerShellRunner.QueryBuilding;
98

109
namespace Kysect.PowerShellRunner.Executions;
@@ -13,9 +12,9 @@ public class PowerShellVariableInitializer
1312
{
1413
private readonly IPowerShellAccessor _accessor;
1514
private readonly PowerShellVariable _variable;
16-
private readonly PowerShellObjectMapper _powerShellObjectMapper;
15+
private readonly IPowerShellObjectMapper _powerShellObjectMapper;
1716

18-
public PowerShellVariableInitializer(IPowerShellAccessor accessor, PowerShellVariable variable, PowerShellObjectMapper powerShellObjectMapper)
17+
public PowerShellVariableInitializer(IPowerShellAccessor accessor, PowerShellVariable variable, IPowerShellObjectMapper powerShellObjectMapper)
1918
{
2019
_accessor = accessor.ThrowIfNull();
2120
_variable = variable.ThrowIfNull();

Sources/Kysect.PowerShellRunner/Mapping/PowerShellObjectMapper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
using Kysect.CommonLib.BaseTypes.Extensions;
22
using Kysect.CommonLib.Reflection;
33
using Kysect.CommonLib.Reflection.TypeCache;
4+
using Kysect.PowerShellRunner.Abstractions.Cmdlets;
45
using Kysect.PowerShellRunner.Abstractions.Objects;
56
using Kysect.PowerShellRunner.Tools;
67
using System.Reflection;
78
using System.Text.Json;
89

910
namespace Kysect.PowerShellRunner.Mapping;
1011

11-
public class PowerShellObjectMapper
12+
public class PowerShellObjectMapper : IPowerShellObjectMapper
1213
{
1314
private readonly PowerShellObjectMappingConfiguration _configuration;
1415
private readonly JsonSerializerOptions _serializerOptions;

0 commit comments

Comments
 (0)